これはよく知られていJavadocが言うことについてStream
インタフェース:マップされたストリームを閉じる - そのアイデアは何ですか?
は、StreamsはBaseStream.close()メソッドを持っているとAutoCloseableを実装し、 が、ほぼすべてのストリーム・インスタンスは、実際に使用した後 を閉じてする必要はありません。 一般に、ソースがIOチャネルであるストリームのみ(Files.lines(Path、Charset)によって返されるような など)は、閉じるを必要とします。 ほとんどのストリームは、特別なリソース管理を必要としない、コレクション、配列、または 関数の生成をサポートしています。
がOK(。ストリーム は閉鎖を要求する場合、それは のtry-と資源文のリソースとして宣言することができる)が、同時に、このインタフェースでflatMapToInt
のような方法があります。
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
はのJavadoc仕様は言う:その内容は このストリームに置かれた後
各マッピングされたストリームが閉じられています。
だから、IntStream
がソースでIOチャネルを持つように設計されていない場合、なぜこの方法で閉じられますか?例えば
ReferencePipeline
実装がこのようにそれをしない、:
try (IntStream result = mapper.apply(u)) {
if (result != null)
result.sequential().forEach(downstreamAsInt);
}
もっと一般的な質問は次のようになります。私たちはIntStream
(またはその子孫)か否かなどのクロージング・ストリームを気にする必要がありますか?そうでなければ、なぜflatMapTo*
が気になるのですか?
EDIT @Tunakiは非常に興味深いemail linkを提供しています。しかし、これはすべて約flatMap
です。ここで私は一般的な場合にストリームを終了する必要があります。しかし、私の質問は特別なケースについてです:flatMapToInt
、flatMapToLong
など、ストリームを閉じる必要はありません。
EDIT-2 @BrianGoetzは、ここに訴え、それは彼の引用電子メールであるので、そのため彼は対象になっている:)
'flatMapToInt'を' flatMap'とは違って扱うことは意味がありません。 'IntStream'はリソースも保持できます。末尾から出てくるものが 'int'であるからといって、ソースが非メモリリソースで始まらなかったというわけではありません。たとえば、各要素が 'Files.lines()。mapToInt(String :: length)'にフラットマップされる 'flatMapToInt'を実行するとします。 –