簡體   English   中英

在異常情況下關閉由 flatMap 打開的 Java 8 流?

[英]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> ,(與大多數流不同)需要關閉。

源碼顯示返回flatMapStream立即被包裹在 try with resources 中,所以即使下游操作拋出異常也會關閉。

更新flatMap javadoc 以明確說明會發生這種情況可能是個好主意。

暫無
暫無

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

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