[英]Closing a Java 8 stream opened by flatMap in case of exception?
Stream.flatMap (Function <T, Stream<U>> mapper)
的 Javadoc 指出:
每個映射流在其內容放入此流后關閉。
好的。 但是異常處理呢?
考慮以下:
public List<Path> search (List<Path> paths) {
return paths.stream ()
.flatMap (dir -> {
try {
return Files.list (dir);
} catch (IOException e) {
throw new UncheckedIOException (e);
}
})
.filter (this::mightThrowException)
.collect (toList ());
}
如果Files.list (Path)
在第一次調用時拋出異常,則它的流永遠不會首先打開,因此不需要關閉。 如果它在以后的調用中拋出異常,則先前調用生成的流都已根據其規范由.flapMap ()
完全處理和關閉。
但是如果過濾器拋出異常會發生什么? 我們正在處理文件列表流,所以我想我需要在某處關閉一些東西,但我不明白到底是什么。 最初的paths.stream ()
可能嗎? 然后會在派生流上調用 close 方法?
注意:對於不熟悉Files.list (Path)
靜態方法的任何人,它返回一個Stream<Path>
,(與大多數流不同)需要關閉。
源碼顯示返回flatMap
的Stream
立即被包裹在 try with resources 中,所以即使下游操作拋出異常也會關閉。
更新flatMap
javadoc 以明確說明會發生這種情況可能是個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.