JavaScriptを使った関数型プログラミングの研究を始めました。この後、私はJava 8(ストリーム、ラムダ、メソッド参照)でそれを研究し始めましたが、コレクションを避けて、できるだけストリームを使用する傾向があることに気付きました。
コンテキストにイベントがない場合、ストリームを使用する意味がないと聞きました。だから、それは私に不思議に思います:
ストリームで解決することを目的とした元の問題は何ですか?
この質問に対する答えがあれば、どちらを使用するかを適切に選択できると思います。
ストリームとコレクションは代替ではなく、完全に異なる目的を果たします。
_Java.util.Collection
_は「もののコレクション」を表すためのインターフェースです。その主な目的は、JavaScriptの配列のようにkeepのものにすることです。
_Java.util.Stream
_は、複数のステージにある処理のインターフェイスです。
ほとんどの場合、実際にはboth、つまり物を含むコレクションがあり、その上で.stream()
を呼び出して処理を行います。
私の推測では、あなたが実際に意味するストリームの代替は「強化されたforループ」だと思います:
_for(String s: collectionInstance){
doSomethingWith(s);
}
_
これは
_collectionInstance.stream().forEach(this::doSomethingWith);
_
そしてここにストリームの利点があります:
しかし、ストリームはコレクションに基づいてではなく、直接使用することもできます。その場合、すべての要素をメモリに保持する必要はありません。ある時点で処理を停止するオンザフライで生成されるinfiniteストリームを使用することもできます。コレクションでそれをやってみてください!
Forループを使用する利点は、主にデバッグが容易になることです。これは、発生する魔法が少ないためです。それはまた、ほとんどの開発者にとってより身近なものです。
私はビッグデータを処理するためにcollectionInstance.stream().forEach()
を使用します。コードは並列に実行され、クラスターに分散されます。
詳細は wikipedia MapReduce を参照してください