簡體   English   中英

Java Stream生命周期回調

[英]Java Stream lifecycle callbacks

當流的最后一個元素被處理並且流被完全“消耗”時,是否存在一種優雅的方式來注冊回調?

特別是當流源(如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()

您想要注冊一個流關閉處理程序

public Stream<Row> query(String sql){
    Connection c = dataSource.openConnection();
    return MyDB.query(sql).stream().onClose(() -> c.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);
        }
    });
}

一個主要工作的實用程序,除非返回的流沒有迭代到最后:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM