web-dev-qa-db-ja.com

Java 8-Java.util.Collectionの代わりにJava.util.Streamをいつ使用すればよいですか?

JavaScriptを使った関数型プログラミングの研究を始めました。この後、私はJava 8(ストリーム、ラムダ、メソッド参照)でそれを研究し始めましたが、コレクションを避けて、できるだけストリームを使用する傾向があることに気付きました。

コンテキストにイベントがない場合、ストリームを使用する意味がないと聞きました。だから、それは私に不思議に思います:

ストリームで解決することを目的とした元の問題は何ですか?

この質問に対する答えがあれば、どちらを使用するかを適切に選択できると思います。

2
Bruno Carneiro

ストリームとコレクションは代替ではなく、完全に異なる目的を果たします。

_Java.util.Collection_は「もののコレクション」を表すためのインターフェースです。その主な目的は、JavaScriptの配列のようにkeepのものにすることです。

_Java.util.Stream_は、複数のステージにある処理のインターフェイスです。

ほとんどの場合、実際にはboth、つまり物を含むコレクションがあり、その上で.stream()を呼び出して処理を行います。

私の推測では、あなたが実際に意味するストリームの代替は「強化されたforループ」だと思います:

_for(String s: collectionInstance){
    doSomethingWith(s);
}
_

これは

_collectionInstance.stream().forEach(this::doSomethingWith);
_

そしてここにストリームの利点があります:

  • 複数の操作を分離して中間変数を減らすことにより、コードをよりクリーンにすることができます。これもステートメントなので、事前にターゲットコレクションを作成する必要はなく、収集した結果を直接割り当てたり返したりできます。
  • 完全なコレクションをメモリ内の中間結果と共に保持することを回避しやすくすることで、メモリ使用量を削減できます。

しかし、ストリームはコレクションに基づいてではなく、直接使用することもできます。その場合、すべての要素をメモリに保持する必要はありません。ある時点で処理を停止するオンザフライで生成されるinfiniteストリームを使用することもできます。コレクションでそれをやってみてください!

Forループを使用する利点は、主にデバッグが容易になることです。これは、発生する魔法が少ないためです。それはまた、ほとんどの開発者にとってより身近なものです。

11

私はビッグデータを処理するためにcollectionInstance.stream().forEach()を使用します。コードは並列に実行され、クラスターに分散されます。

詳細は wikipedia MapReduce を参照してください

0
k3b