[英]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.