Java での Stream Reduce 操作

Mohammad Irfan 2023年10月12日
  1. Java での削減とは
  2. Java 8 でのストリーム reduce() 操作
  3. Java で reduce() 操作を使用して合計を見つける
  4. Java で reduce() とメソッドリファレンスを使用して合計を見つける
  5. Java で reduce() 操作を使用して最小値と最大値を求める
  6. まとめ
Java での Stream Reduce 操作

このチュートリアルでは、reduce() 操作の詳細とその例のいくつかについて説明します。reduce() 操作について説明する前に。まず、削減について説明しましょう。

Java での削減とは

JDK の多くの端末操作(平均、合計、最小、最大、カウントなど)は、ストリームの内容を組み合わせて単一の値を出力します。リダクション操作は同じことを行い、単一のストリームを返します。

さらに、JDK には、単一の値ではなくコレクションを返す削減操作が含まれています。多くの削減プロセスは、値の平均の計算やアイテムの分類など、特定の仕事を遂行します。

一方、JDK には、削減および収集と呼ばれる汎用の削減操作があります。

Java 8 でのストリーム reduce() 操作

reduce() 操作は、汎用の削減操作です。reduce() 操作の構文は次のとおりです。

T reduce(T identity, BinaryOperator<T> accumulator)

リダクション操作には 2つの引数があります。

  • identityidentity 要素は、削減の開始値であり、ストリームに要素が含まれていない場合のデフォルトの結果でもあります。
  • accumulatoraccumulator 関数は、部分的な削減結果とストリームの次の要素の 2つの引数を受け入れます。それは私たちに新しい部分的な結果を与えます。

reduce() 操作は、端末操作の一種です。

Java で reduce() 操作を使用して合計を見つける

Java の StreamAPI を使用して、配列のすべての要素の合計を計算してみましょう。以下のコードを見てください。

import java.util.Arrays;
public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {45, 56, 87, 323, 47, 20, 658, 985, 78, 123};
    int sum = Arrays.stream(numbers).reduce(0, (a, b) -> a + b);

    System.out.print("sum: " + sum);
  }
}

出力:

sum: 2422

reduce() 関数を使用しない場合は、すべての要素の合計を取得するために以下のコードを記述する必要があります。以下の例を参照してください。

import java.util.Arrays;
public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {45, 56, 87, 323, 47, 20, 658, 985, 78, 123};
    int sum = 0;
    for (int i : numbers) {
      sum += i;
    }
    System.out.println("sum : " + sum);
  }
}

出力:

sum : 2422

Java で reduce() とメソッドリファレンスを使用して合計を見つける

次のように sum() メソッド参照 Integer::sum を渡して、すべての要素の合計を取得することもできます。以下のコードを見てください。

import java.util.Arrays;
public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {45, 56, 87, 323, 47, 20, 658, 985, 78, 123};
    int sum = Arrays.stream(numbers).reduce(0, Integer::sum);

    System.out.print("sum: " + sum);
  }
}

出力:

sum: 2422

配列が空で、要素の合計を取得するために配列を渡した場合、例外はスローされず、代わりにゼロの結果が得られます。以下の例を参照してください。

import java.util.Arrays;
public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {};
    int sum = Arrays.stream(numbers).reduce(0, Integer::sum);

    System.out.print("sum: " + sum);
  }
}

出力:

sum: 0

ご覧のとおり、配列が空の場合、ID 要素が返されます。

Java で reduce() 操作を使用して最小値と最大値を求める

一般に、配列内の min 要素と max 要素を見つけるには、次のような for ループと if-else ステートメントの組み合わせを使用します。

public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {45, 56, 87, 323, 47, 20, 658, 985, 78, 123};
    // finding the min element
    int min = numbers[0];
    for (int i : numbers) {
      if (min > i) {
        min = i;
      }
    }
    // finding the max element
    int max = numbers[0];
    for (int i : numbers) {
      if (max < i) {
        max = i;
      }
    }
    // printing the max and min value
    System.out.println("max: " + max);
    System.out.println("min: " + min);
  }
}

出力:

max: 985
min: 20

コードをより簡潔にする reduce() 操作を使用して、配列内の最小要素と最大要素を見つけることができます。以下の例を参照してください。

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {45, 56, 87, 323, 47, 20, 658, 985, 78, 123};
    // finding the min element
    int min = Arrays.stream(numbers).reduce(Integer.MAX_VALUE, (a, b) -> a < b ? a : b);
    // finding the max element
    int max = Arrays.stream(numbers).reduce(Integer.MIN_VALUE, (a, b) -> a > b ? a : b);
    // printing the max and min value
    System.out.println("max: " + max);
    System.out.println("min: " + min);
  }
}

出力:

max: 985
min: 20

配列から最小要素と最大要素を計算するためにメソッド参照を使用することもできます。以下のコードを見てください。

import java.util.Arrays;
public class SimpleTesting {
  public static void main(String args[]) {
    int[] numbers = {45, 56, 87, 323, 47, 20, 658, 985, 78, 123};
    // finding the min element
    int min = Arrays.stream(numbers).reduce(Integer.MAX_VALUE, Integer::min);
    // finding the max element
    int max = Arrays.stream(numbers).reduce(Integer.MIN_VALUE, Integer::max);
    // printing the max and min value
    System.out.println("max: " + max);
    System.out.println("min: " + min);
  }
}

出力:

max: 985
min: 20

まとめ

このチュートリアルでは、リダクション操作について学習しました。次に、reduce() 操作のトピックを深く掘り下げました。最後に、基本的な算術関数を簡潔に実行する方法の例をいくつか見てきました。

関連記事 - Java Stream