Java - SummaryStatisticsの使用方法(count、min、max、average)

Java 8で導入されたSummaryStatisticsは、count、min、max、sum averageなどのstatistics情報を計算するクラスです。そしてストリームと一緒に使用することができます。

SummaryStatisticsは、Int、Long、Doubleデータ型をサポートする以下のクラスを使用できます。以下のようにサポートするデータ型ごとにクラス名が異なります。

  • IntSummaryStatistics
  • LongSummaryStatistics
  • DoubleSummaryStatistics

この記事では、SummaryStatisticsの基本的な使用方法と例について説明します。

1. IntSummaryStatistics

次の例は、StreamでIntSummaryStatisticsを使用する例です。

以下の例を見ると、Streamは文字列を要素に渡し、 mapToInt()でStringをIntに変換しました。 そして、このストリームに対して summaryStatistics() で statistics オブジェクトを生成しました。

SummaryStatistics は以下のように getMax(), getMin(), getAverage(), getCount() などの関数を提供し、簡単に最大値、最小値、平均などを計算できます。

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();

System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());

Output:

Max: 10
Min: 4
Average: 6.2
Count: 5

SummaryStatisticsの関数名が示すように、次の値を返します。

  • IntSummaryStatistics.getMax() : 最大値
  • IntSummaryStatistics.getMin() : 最小値
  • IntSummaryStatistics.getAverage() : 平均値
  • IntSummaryStatistics.getCount() : 要素の総数

2. IntSummaryStatistics.accept()

accept() は IntSummaryStatistics オブジェクトに新しいアイテムを追加するメソッドです。以下のコードでは、acceptメソッドとして20を追加し、結果を見ると、既存の値に20まで含めて計算された結果が出力されました。

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();
stats.accept(20);

System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());

Output:

Max: 20
Min: 4
Average: 8.5
Count: 6

3. IntSummaryStatistics.combine()

combine() は、2 つの statistics オブジェクトを結合する関数です。

以下のコードを見ると、stats、stats2オブジェクトを作成し、combine()で2つのオブジェクトを結合しました。結果を見ると、2つのオブジェクトの結果として再計算された結果が出力されました。

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();

List<String> companies =
        Arrays.asList("google", "apple", "google", "apple", "samsung");
IntSummaryStatistics stats2 = companies.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();

stats.combine(stats2);

System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());

Output:

Max: 10
Min: 4
Average: 6.0
Count: 10

4. Collectors.summarizingInt() で SummaryStatistics を作成する

collect() 関数と Collectors.summarizingInt() を使って SummaryStatistics オブジェクトを作成することもできます。

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
            .collect(Collectors.summarizingInt(String::length));

 System.out.println("Max: " + stats.getMax());
 System.out.println("Min: " + stats.getMin());
 System.out.println("Average: " + stats.getAverage());
 System.out.println("Count: " + stats.getCount());

Output:

Max: 10
Min: 4
Average: 6.2
Count: 5

5. LongSummaryStatistics, DoubleSummaryStatistics の使用方法

上記のIntSummaryStatisticsの例とクラス名だけが異なるだけで、実装方法は同じです。

Related Posts

codechachaCopyright ©2019 codechacha