Java Stream 生命周期回调

标签 java java-stream

当流的最后一个元素已被处理并且流被完全“消耗”时,是否存在一种优雅的方法来注册回调?

特别是当流源(如数据库游标、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/

相关文章:

java - 框架内有 2 个 J 面板。左侧面板是带有按钮的菜单。使用按钮切换右面板。

java - 检测拖动已取消 JavaFX

java - 将 PNG 转换为 JPEG

java - Java 8 Stream 中有多个正则表达式从 Line 读取文本

java - quartz 调度程序 : Failed to obtain DB connection from data source

java - 在 Jbutton 启用之前要填充多个 Jtextfields

lambda - 在java中,为什么stream peek对我不起作用?

java-8 - Java 8 流已被操作或关闭

java - 使用 Stream.filter 时出现错误 -> "com.google.gson.internal.LinkedTreeMap cannot be cast to"

Java 8 流 : conditional Collector