Java 中的 Stream 的 reduce 操作
Mohammad Irfan
2023年10月12日
-
Java 中的
reduce
是什么 -
Java 8 中的流
reduce()
操作 -
在 Java 中使用
reduce()
运算求和 -
在 Java 中使用
reduce()
和方法参考求和 -
在 Java 中使用
reduce()
操作查找最小值和最大值 - 结论
本教程将讨论 reduce()
操作细节并讨论它的一些示例。在讨论 reduce()
操作之前。让我们首先讨论减少。
Java 中的 reduce
是什么
JDK 中的许多终端操作(例如平均值、求和、最小值、最大值和计数)结合流的内容以输出单个值。还原操作执行相同的操作并返回单个流。
此外,JDK 包括返回集合而不是单个值的还原操作。许多还原过程完成特定的工作,例如计算值的平均值或对项目进行分类。
另一方面,JDK 具有称为还原和收集的通用还原操作。
Java 8 中的流 reduce()
操作
reduce()
操作是一种通用的还原操作。reduce()
操作的语法是:
T reduce(T identity, BinaryOperator<T> accumulator)
reduce
操作有两个参数:
identity
:identity
元素既是还原的起始值,也是流不包含元素时的默认结果。accumulator
:accumulator
函数接受两个参数:部分还原结果和流的下一个元素。它给了我们一个新的部分结果。
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()
操作的主题。最后,我们看到了几个如何简洁地执行基本算术函数的示例。