Java 8で導入されたStream APIの分類についてメモ。
ストリーム型
java.lang.stream
パッケージでは4種類のインタフェースが提供される。いずれもBaseStream<T,S>
インタフェースを継承する。
インタフェース | 用途 |
---|---|
Stream<T> |
T 型ストリーム(ジェネリクス) |
IntStream |
プリミティブ型int ストリーム |
LongStream |
プリミティブ型long ストリーム |
DoubleStream |
プリミティブ型double ストリーム |
ストリームパイプライン中の中間操作*1により、任意のストリーム型相互変換が可能。
ストリームパイプライン構成要素
ストリームパイプライン(stream pipeline)は、1個の「ソース」、0個以上の「中間操作」、1個の「終端操作」から構成される。ソースと中間操作はストリーム型を返すため、メソッドチェイン形式で処理をつなげてストリームパイプラインを表現する。ストリームパイプラインの動作は、ソースまたは中間操作*2が提供するスプリッテレータSpliterator
特性とストリーム特性、それぞれの中間操作および終端操作の種別から、それらの組み合わせに応じて決定される。
- スプリッテレータ(spliterator)特性
- 有限長(
SIZED
,SUBSIZED
)/無限 - 整列済み(
SORTED
かつORDERED
)/順序付け(ORDERED
)/非順序付け - 変更不可(
IMMUTABLE
)/並行変更可能(CONCURRENT
)/その他 - 一意性保証(
DISTINCT
)/保証なし - 非null保証(
NONNULL
)/null許容
- 有限長(
- ストリーム(stream)特性
- 順次処理ストリーム(sequential)
- 並列処理ストリーム(parallel)
- 中間操作(intermediate operation)
- ステートレス(stateless)操作
- ステートフル(stateful)操作:
distinct()
,sorted()
,skip()
,limit()
- 短絡(short-circuiting)操作:
limit()
- 副作用(side-effect)操作:
peek()
- 終端操作(terminal operation)
- リダクション操作
- 並行リダクション(concurrent reduction):
collect()
(一定条件を満たすとき) - 可変リダクション(mutable reduction):
collect()
- リダクション(reduction)
- 並行リダクション(concurrent reduction):
- 短絡(short-circuiting)操作:
anyMatch()
,allMatch()
,noneMatch()
,findFirst()
,findAny()
- 副作用(side-effect)操作:
forEach()
,forEachOrdered()
- その他:
iterator()
,spliterator()
- リダクション操作
コレクタ構成要素
終端操作の一種、リダクション操作はCollector<T,A,R>
インタフェースにより一般化される。コレクタ(collector)は、サプライヤ関数+アキュムレータ関数+コンバイナ関数+フィニッシャ関数と、コレクタ特性にて記述される。
- サプライヤ(supplier)関数: 空の可変結果コンテナ型Aの供給(
() -> A
) - アキュムレータ(accumulator)関数: 可変結果コンテナ型Aへの要素型Tの蓄積処理(
A + T -> void
) - コンバイナ(combiner)関数: 2つの可変結果コンテナ型Aの結合演算(
A + A -> A
) - フィニッシャ(finisher)関数: 最終的な可変結果コンテナ型Aから結果コンテナRへの変換(
A -> R
)
コレクタは下記コレクタ特性Collector.Characteristics
の和集合を持つ。
- 並行コレクタ(
CONCURRENT
): アキュムレータ関数を並行呼出可能(可変結果コンテナAがスレッドセーフ)*3 - 非順序コレクタ(
UNORDERED
): 入力順序を維持しない(結果コンテナRが順序性を維持しない)*4 - 恒等フィニッシャ(
IDENTITY_FINISH
): フィニッシャ関数を省略可能(Collector<T,R,R>
)
関連URL