有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java流生命周期回调

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

尤其是当流源(如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()API,但这依赖于用户在流上显式调用close()


共 (1) 个答案

  1. # 1 楼答案

    调用^{},并记录调用者必须关闭返回的流

    /**
     * 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);
            }
        });
    }