Java 中的 Stream 的 reduce 操作

Mohammad Irfan 2023年10月12日
  1. Java 中的 reduce 是什麼
  2. Java 8 中的流 reduce() 操作
  3. 在 Java 中使用 reduce() 運算求和
  4. 在 Java 中使用 reduce() 和方法參考求和
  5. 在 Java 中使用 reduce() 操作查詢最小值和最大值
  6. まとめ
Java 中的 Stream 的 reduce 操作

本教程將討論 reduce() 操作細節並討論它的一些示例。在討論 reduce() 操作之前。讓我們首先討論減少。

Java 中的 reduce 是什麼

JDK 中的許多終端操作(例如平均值、求和、最小值、最大值和計數)結合流的內容以輸出單個值。還原操作執行相同的操作並返回單個流。

此外,JDK 包括返回集合而不是單個值的還原操作。許多還原過程完成特定的工作,例如計算值的平均值或對專案進行分類。

另一方面,JDK 具有稱為還原和收集的通用還原操作。

Java 8 中的流 reduce() 操作

reduce() 操作是一種通用的還原操作。reduce() 操作的語法是:

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

reduce 操作有兩個引數:

  • identityidentity 元素既是還原的起始值,也是流不包含元素時的預設結果。
  • accumulatoraccumulator 函式接受兩個引數:部分還原結果和流的下一個元素。它給了我們一個新的部分結果。

reduce() 操作是一種終端操作。

在 Java 中使用 reduce() 運算求和

讓我們使用 Java 中的 Stream API 計算陣列中所有元素的總和。看下面的程式碼:

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

如我們所見,如果陣列為空,則返回標識元素。

在 Java 中使用 reduce() 操作查詢最小值和最大值

通常,要找到陣列中的最小和最大元素,我們使用 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