update.いまさらですが、JavaのStreamについてざっくりまとめます。基本的にはStreamのJavaDocを参考にしながらまとめてますが、メソッド内引数の型変数など細かいところは省略しているので、詳しくはJavaDocの方を参照。StreamはJava8から登場した概念で、要素の集まりに対して様々な処理を行うことができるものです。3段階に分けられます。生成と終端操作は1つのストリーム操作につき一度だけ実行しますが、中間操作は複数回行うことができます。中間操作のメソッドはStreamインスタンスを返すメソッドとして設計さているため、メソッドチェーンによる記述が可能です。生成はその名の通り、Streamを最初に生成するための処理です。Streamはインターフェースであり、実装クラスも普通にインスタンス化される形では提供されていません。Collectionではstream()やparallel()メソッドが提供されており、要素のStreamを取得することができますが、Collectionを生成せずにStreamだけ得たいという場合も多いです。そこで、Streamに用意されている以下のようなstaticメソッドを使用してStreamを生成することができます。引数によるT:Stream内要素の型また、Stream.builder()で得られるBuilderを使用し、Streamを生成する方法もあります。Stream内の要素に対して操作を行います。中間操作では操作を各要素に適用後の新しいStreamインスタンスが返されるため、メソッドチェーンで中間操作を連結していくことができます。ストリーム自体の性質を変更する操作です。中身の要素は変化しません。Streamではなく、その親インターフェースであるBaseStreamで定義されています。close時のハンドラの登録ステートレスな中間操作ステートレスな中間操作とは、1つの要素に操作を行う場合に他の要素に影響を受けない中間操作のことです。そのため、並列処理に向いており、中間処理はできるだけステートレスにすることが推奨されています。以下、eやen(n:整数)をストリーム内の要素とします。ストリームの要素はそのままで、各要素に対してfを実行するステートフルな中間操作ステートフルな中間操作とは、1つの要素に操作を行う場合に他の要素の影響を受ける中間操作のことです。操作によっては結果を返すためにStream内のすべての要素が必要になる場合もあります。並べ替え処理を実現するsortedメソッドなどがその例です。他の要素の影響を受けることから、ステートフルな中間操作では並列処理の際に複雑な処理が制御が必要となり、順次処理よりも効率が低下する可能性があります。最初のn個の要素を破棄するlimitは特に短絡中間操作と呼ばれます。短絡操作とは、無限ストリームを有限ストリームにできる可能性がある操作のことです。limitやskipは、distinctやsortedに比べて要素の数だけを見るために並列処理が高速だと思われがちですが、順序付けられたストリームでは「最初からn個」を調べる必要があるためコストが高い操作になります。呼び出された時点でのStreamの内容に対して処理を行い、Stream以外の結果(結果なし(void)を含む)を返します。終端操作完了後はそれまで使用してきたStreamは使用不可能になり、再度使おうとするとIllegalStateExceptionがthrowされます。そのため、Streamオブジェクトは変数に取るべきではなくメソッドチェーンで処理するのが正しいと言えます。各要素に対してactionを実行する。リダクション(畳み込み)。単位元unitに対して要素を累積関数accで結合していった結果を返す。