当流的最后一个元素已经被处理并且流被完全“消费”时,有没有一种优雅的方法来注册回调?
尤其是当流源(如DB游标、Iterator<T>或自定义Supplier<T>)是有限的,并且可以显式地知道何时不再有数据时。
示例:
public Stream<Row> query(String sql){
Connection c = dataSource.openConnection();
Stream<Row> rows = MyDB.query(sql).stream();
c.close();
return rows;
}现在,立即关闭连接是徒劳的,相反,当流被完全消耗时安排连接关闭将是很好的。
我知道有onClose()应用程序接口,但这依赖于消费者显式地在流上调用close()。
发布于 2019-06-13 17:08:49
调用onClose,并记录返回的流必须被调用者关闭。
/**
* The returned stream must be closed.
*/
public Stream<Row> query(String sql){
Connection c = dataSource.openConnection();
return MyDB.query(sql).stream().onClose(() -> {
try {
c.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
});
}发布于 2019-06-13 17:08:12
您想要注册stream close handler
public Stream<Row> query(String sql){
Connection c = dataSource.openConnection();
return MyDB.query(sql).stream().onClose(() -> c.close());
}此方法的调用方必须异常关闭流!
(注意:我在这里省略了异常处理。)
发布于 2019-06-13 18:44:46
一个主要起作用的实用工具,除非返回的流没有迭代到末尾:
public <T> Stream<T> wrap(Stream<T> stream, Runnable onEnd) {
final Object endSignal = new Object();
return Stream.concat(stream, Stream.of(endSignal))
.peek(i -> {
if(i == endSignal){onEnd.run();}
})
.filter(i -> i != endSignal)
.map(i -> (T) i);
}https://stackoverflow.com/questions/56576890
复制相似问题