これらは、実行時の潜在的なメモリ フットプリントが大きく異なります。はすべてのデータを収集してコレクションに入れcollect()
ますが、ストリームを通過したデータを減らす方法を明示的に指定するように求めます。reduce()
たとえば、ファイルからデータを読み取って処理し、データベースに配置する場合、次のような Java ストリーム コードになる可能性があります。
streamDataFromFile(file)
.map(data -> processData(data))
.map(result -> database.save(result))
.collect(Collectors.toList());
この場合、collect()
Java に強制的にデータをストリーミングさせ、結果をデータベースに保存させるために使用します。データがなければcollect()
、読み取られたり保存されたりすることはありません。
java.lang.OutOfMemoryError: Java heap space
ファイル サイズが十分に大きい場合、またはヒープ サイズが十分に小さい場合、このコードは喜んで実行時エラーを生成します。明らかな理由は、ストリームを通過したすべてのデータ (そして、実際には既にデータベースに格納されている) を結果のコレクションにスタックしようとし、これがヒープを爆破することです。
ただし、 -- に置き換えるcollect()
とreduce()
、後者はそれを通過したすべてのデータを削減して破棄するため、もはや問題にはなりません。
collect()
提示された例では、何かに置き換えてreduce
ください:
.reduce(0L, (aLong, result) -> aLong, (aLong1, aLong2) -> aLong1);
result
Java は純粋な FP (関数型プログラミング) 言語ではなく、副作用の可能性があるため、ストリームの下部で使用されていないデータを最適化することはできないため、計算が依存するように気にする必要さえありません。.