当流的最后一个元素已被处理并且流被完全“消耗”时,是否存在一种优雅的方法来注册回调?
特别是当流源(如数据库游标、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()
API 但这依赖于消费者显式调用 close()
在流中。
最佳答案
调用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);
}
});
}
关于Java Stream 生命周期回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56576890/