Java 中的 Stream 的 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()
操作的主题。最后,我们看到了几个如何简洁地执行基本算术函数的示例。
相关文章
Java 中的 volatile 关键字
发布时间:2023/11/13 浏览次数:173 分类:Java
-
本文讨论了 Java 中的 volatile 关键字及其优缺点,并举例说明了如何使用。Java 是一种非常流行的编程语言,通过了解 Java,我们可以很容易地理解它为什么会在编程社区中获得这样的地位。
Java 中的 StringUtils
发布时间:2023/11/13 浏览次数:80 分类:Java
-
本文介绍 Java 中的 StringUtils 类是什么。本文介绍什么是 StringUtils 以及如何在 Java 中使用它来处理字符串。StringUtils 是一个用于处理 String 的类,它提供了比 Java String 类更多的实用方法。
Java 中的 flatMap
发布时间:2023/11/13 浏览次数:132 分类:Java
-
本文介绍 flatMap 以及如何在 Java 中使用它。本文介绍 flatMap 以及如何在 Java 中使用它。flatMap 是 Java 流中的一个操作/函数,用于在执行某些功能性任务后获取新流。在这里,我们将讨论 flatMap
在 Java 中将 Stream 元素转换为映射
发布时间:2023/11/13 浏览次数:77 分类:Java
-
我们将使用 Java 将流元素转换为映射。我们将向你展示如何使用 Collectors.toMap() 从 Java 字符串中提取映射。我们将讨论 Java Streams 的实际用途以及如何将流元素转换为映射元素。
Java 中的 findFirst 流方法
发布时间:2023/11/13 浏览次数:171 分类:Java
-
本教程介绍 Java 中的 findFirst 流方法。java.util.stream API 是在 Java 8 中引入的;它用于处理对象的集合。不同的源(例如数组或集合)可以创建流。
修复 Java NoClassDefFoundError 错误
发布时间:2023/11/13 浏览次数:199 分类:Java
-
本文介绍如何修复 Java 中的 NoClassDefFoundError。在 Java 语言中,错误是主要由于缺乏资源而发生的异常。此外,错误无法在编译时捕获并在运行时发生。
在 Java 中扩展 Comparable
发布时间:2023/10/19 浏览次数:97 分类:Java
-
本教程展示了如何在 Java 中清除 StringBuilder 本指南将了解在 Java 中扩展 Comparable 接口。它写成 Comparable
。它是一个由 Java 中的许多类实现的接口。
Java 中的 Predicate 是什么
发布时间:2023/10/19 浏览次数:109 分类:Java
-
本文介绍 Java 8 中的 Predicate 接口。本教程通过 Java 示例介绍 Predicate 接口。Predicate 是 Java 中的一个接口,用作 lambda 表达式或方法引用的目标赋值。