実行時の潜在的なメモリフットプリントは大きく異なります。一方で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(関数型プログラミング)言語ではないため、計算に依存するように注意する必要もありません。副作用の可能性があるため、ストリームの下部で使用されていないデータを最適化できません。 。