Collections 中級

単一のストリームパスで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
難易度
中級
Collectors.teeing()
利用可能

JDK 12(2019年3月)以降、広く利用可能

Collectors.teeing()は各要素を2つの下流コレクターに送り、結果をマージします。データを2回ストリーム処理したり、変更可能なアキュムレータを使ったりする必要がなくなります。

共有 𝕏 🦋 in