コレクションに対するマップ-リデュース変換など、要素のストリームに対する関数型の操作をサポートするクラスです。たとえば、
int sum = widgets.stream()
.filter(b -> b.getColor() == RED)
.mapToInt(b -> b.getWeight())
.sum();
ここでは、Collection<Widget>であるwidgetsをストリームのソースとして使用した後、そのストリームに対してフィルタ-マップ-リデュースを実行し、赤いウィジェットの重量の合計を取得しています。(合計はリダクション操作の一例です。)
このパッケージで導入された主な抽象は、ストリームです。クラスStream、IntStream、LongStreamおよびDoubleStreamは、オブジェクトおよびプリミティブ型int、longおよびdoubleに対するストリームです。ストリームはいくつかの点でコレクションと異なります。
Streamをフィルタリングすると、ソースであるコレクションの要素が削除されるのではなく、フィルタリングされた要素を含まない新しいStreamが生成されます。Stringを探す場合、すべての入力文字列を検査する必要はありません。ストリーム操作は中間操作(Streamを生成する操作)と終端操作(値または副作用を生成する操作)に分けられます。中間操作は常に遅延的です。limit(n)やfindFirst()などの短絡操作を使えば、無限ストリームに対する計算を有限の時間で終わらせることができます。Iteratorと同様、ソースの同じ要素を再度使用するには、新しいストリームを生成する必要があります。ストリームはさまざまな方法で取得できます。いくつかの例を以下に示します。
Collectionから(stream()およびparallelStream()メソッド経由)。Arrays.stream(Object[])経由)。Stream.of(Object[])](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#of-T...-)、IntStream.range(int, int)、Stream.iterate(Object, UnaryOperator)など)から。BufferedReader.lines()からファイルの行を取得できます。Filesのメソッドからファイル・パスのストリームを取得できます。Random.ints()から乱数のストリームを取得できます。BitSet.stream()、Pattern.splitAsStream(java.lang.CharSequence)、JarFile.stream()など)。サードパーティー・ライブラリは、これらのテクニックを使って追加のストリーム・ソースを提供できます。