首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java流生命周期回调

Java流生命周期回调
EN

Stack Overflow用户
提问于 2019-06-13 16:56:22
回答 3查看 330关注 0票数 2

当流的最后一个元素已经被处理并且流被完全“消费”时,有没有一种优雅的方法来注册回调?

尤其是当流源(如DB游标、Iterator<T>或自定义Supplier<T>)是有限的,并且可以显式地知道何时不再有数据时。

示例:

代码语言:javascript
复制
public Stream<Row> query(String sql){
   Connection c = dataSource.openConnection();
   Stream<Row> rows = MyDB.query(sql).stream();
   c.close();
   return rows;
}

现在,立即关闭连接是徒劳的,相反,当流被完全消耗时安排连接关闭将是很好的。

我知道有onClose()应用程序接口,但这依赖于消费者显式地在流上调用close()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-13 17:08:49

调用onClose,并记录返回的流必须被调用者关闭。

代码语言:javascript
复制
/**
 * 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);
        }
    });
}
票数 4
EN

Stack Overflow用户

发布于 2019-06-13 17:08:12

您想要注册stream close handler

代码语言:javascript
复制
public Stream<Row> query(String sql){
    Connection c = dataSource.openConnection();
    return MyDB.query(sql).stream().onClose(() -> c.close());
}

此方法的调用方必须异常关闭流!

(注意:我在这里省略了异常处理。)

票数 4
EN

Stack Overflow用户

发布于 2019-06-13 18:44:46

一个主要起作用的实用工具,除非返回的流没有迭代到末尾:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56576890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档