summarizingInt / summarizingLong / summarizingDouble — 統計情報を一発取得
Stream API の Collectors.summarizingInt / summarizingLong / summarizingDouble は、数値データに対して 件数・合計・最小値・最大値・平均 をまとめて一発で取得できる便利な集約機能です。
SQL の SUM, AVG, MIN, MAX, COUNT を同時に返すイメージです。
基本の仕組み
- summarizingInt(ToIntFunction)
→ 要素から int 値を取り出し、統計情報をまとめる。
→ 戻り値はIntSummaryStatistics。 - summarizingLong(ToLongFunction)
→ long 値を対象に統計情報をまとめる。
→ 戻り値はLongSummaryStatistics。 - summarizingDouble(ToDoubleFunction)
→ double 値を対象に統計情報をまとめる。
→ 戻り値はDoubleSummaryStatistics。
基本コード例
int の統計情報
import java.util.*;
import java.util.stream.*;
public class SummarizingBasic {
public static void main(String[] args) {
List<Integer> nums = List.of(10, 20, 30, 40);
IntSummaryStatistics stats =
nums.stream()
.collect(Collectors.summarizingInt(n -> n));
System.out.println("count=" + stats.getCount());
System.out.println("sum=" + stats.getSum());
System.out.println("min=" + stats.getMin());
System.out.println("max=" + stats.getMax());
System.out.println("avg=" + stats.getAverage());
}
}
Java- 出力例:
count=4 sum=100 min=10 max=40 avg=25.0
double の統計情報
List<Double> prices = List.of(100.5, 200.0, 150.25);
DoubleSummaryStatistics stats =
prices.stream()
.collect(Collectors.summarizingDouble(p -> p));
System.out.println(stats);
// DoubleSummaryStatistics{count=3, sum=450.75, min=100.5, average=150.25, max=200.0}
Java例題で理解する
例題1: 学生の点数を統計情報にまとめる
record Student(String name, int score) {}
List<Student> students = List.of(
new Student("Tanaka",80),
new Student("Sato",55),
new Student("Ito",90)
);
IntSummaryStatistics stats =
students.stream()
.collect(Collectors.summarizingInt(Student::score));
System.out.println("合計=" + stats.getSum());
System.out.println("平均=" + stats.getAverage());
System.out.println("最高点=" + stats.getMax());
System.out.println("最低点=" + stats.getMin());
System.out.println("人数=" + stats.getCount());
Java例題2: 商品価格の統計情報
record Product(String name, int price) {}
List<Product> products = List.of(
new Product("A",100),
new Product("B",250),
new Product("C",160)
);
IntSummaryStatistics stats =
products.stream()
.collect(Collectors.summarizingInt(Product::price));
System.out.println(stats);
// IntSummaryStatistics{count=3, sum=510, min=100, average=170.0, max=250}
Java例題3: センサー値(double)の統計情報
List<Double> temps = List.of(36.5, 37.2, 36.8, 37.0);
DoubleSummaryStatistics stats =
temps.stream()
.collect(Collectors.summarizingDouble(t -> t));
System.out.println("平均温度=" + stats.getAverage());
System.out.println("最高温度=" + stats.getMax());
System.out.println("最低温度=" + stats.getMin());
Javaテンプレート集
- 基本形(int)
IntSummaryStatistics stats =
stream.collect(Collectors.summarizingInt(x -> 値));
Java- 基本形(long)
LongSummaryStatistics stats =
stream.collect(Collectors.summarizingLong(x -> 値));
Java- 基本形(double)
DoubleSummaryStatistics stats =
stream.collect(Collectors.summarizingDouble(x -> 値));
Java- 統計情報の利用
stats.getCount(); // 件数
stats.getSum(); // 合計
stats.getMin(); // 最小値
stats.getMax(); // 最大値
stats.getAverage(); // 平均
Java落とし穴と回避策
- 空ストリーム: count=0、sum=0、min/max は極端値(intなら最大/最小値)になる。平均は NaN。必ず件数チェックを。
- 型の選び方: 値が大きいなら long/double を選ぶ。int ではオーバーフローに注意。
- 大量データ: 全件を走査するので O(n)。ただし一度で統計が揃うので効率的。
まとめ
summarizingInt/Long/Doubleは「件数・合計・最小・最大・平均」を一発で取得できる便利な Collector。- SQL の集計関数をまとめて返すイメージで、レポートや統計処理に最適。
- 型に応じて Int/Long/Double を選び、空ストリームやオーバーフローに注意すれば安心して使える。
👉 練習課題: 「社員リストから年齢の統計情報を summarizingInt で取得」してみると、統計情報の便利さが体感できます。
