Collectors.teeing()
単一のストリームパスで2つの集計を計算する。
コード比較
✕ Java 8
long count = items.stream().count();
double sum = items.stream()
.mapToDouble(Item::price)
.sum();
var result = new Stats(count, sum);
✓ Java 12+
var result = items.stream().collect(
Collectors.teeing(
Collectors.counting(),
Collectors.summingDouble(Item::price),
Stats::new
)
);
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
シングルパス
ストリームを2回ではなく1回処理します。
組み合わせ可能
マージャー関数で任意の2つのコレクターを組み合わせます。
不変な結果
レコードや値オブジェクトに直接マージします。
旧来のアプローチ
2回のパス
モダンなアプローチ
teeing()
JDKバージョン
12
難易度
中級
JDKサポート
Collectors.teeing()
利用可能
JDK 12(2019年3月)以降、広く利用可能
仕組み
Collectors.teeing()は各要素を2つの下流コレクターに送り、結果をマージします。データを2回ストリーム処理したり、変更可能なアキュムレータを使ったりする必要がなくなります。
関連ドキュメント