Java 逆引き集 | summarizingInt/Long/Double — 統計情報を一発取得

Java Java
スポンサーリンク

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 で取得」してみると、統計情報の便利さが体感できます。

タイトルとURLをコピーしました