Java 相当于 Python 的 reduce 函数是什么?
What is the Java equivalent to Python's reduce function?
有人问过类似的问题,here and here,但鉴于 Java 8 的出现,以及这些问题普遍过时的性质,我想知道现在是否至少有一些东西喜欢它吗?
This 是我指的。
您可以使用 lambda 和 Stream.reduce,文档中有一个页面专门用于 reductions:
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
这是使用 Java 8 个流实现的 example used in the Python docs:
List<Integer> numbers = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);
System.out.println(sum.get());
The Stream.reduce Method
Stream.reduce 方法是一种通用的归约操作。考虑以下管道,它计算集合花名册中男性成员的年龄总和。它使用Stream.sum归约操作:
Integer totalAge = roster
.stream()
.mapToInt(Person::getAge)
.sum();
将此与以下管道进行比较,后者使用 Stream.reduce 操作来计算相同的值:
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
本例中的 reduce 操作有两个参数:
identity:标识元素既是归约的初始值,也是流中没有元素时的默认结果。在本例中,身份元素为 0;这是年龄总和的初始值,如果集合名册中没有成员,则为默认值。
accumulator:accumulator 函数有两个参数:归约的部分结果(在这个例子中,到目前为止所有已处理整数的总和)和流的下一个元素(在这个例子中,一个整数)。它 returns 一个新的部分结果。在此示例中,累加器函数是一个 lambda 表达式,它将两个整数值和 returns 一个整数值相加:
(a, b) -> a + b
reduce 操作总是returns 一个新值。但是,累加器函数每次处理流的元素时也会 returns 一个新值。假设您要将流的元素缩减为更复杂的对象,例如集合。这可能会影响应用程序的性能。如果您的 reduce 操作涉及将元素添加到集合中,那么每次您的累加器函数处理一个元素时,它都会创建一个包含该元素的新集合,这是低效的。相反,更新现有集合会更有效。您可以使用下一节介绍的 Stream.collect 方法来完成此操作。
oracle官方教程描述了Stream.reduce是如何工作的。请看一下,我相信它会回答你的问题。
有人问过类似的问题,here and here,但鉴于 Java 8 的出现,以及这些问题普遍过时的性质,我想知道现在是否至少有一些东西喜欢它吗?
This 是我指的。
您可以使用 lambda 和 Stream.reduce,文档中有一个页面专门用于 reductions:
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
这是使用 Java 8 个流实现的 example used in the Python docs:
List<Integer> numbers = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);
System.out.println(sum.get());
The Stream.reduce Method
Stream.reduce 方法是一种通用的归约操作。考虑以下管道,它计算集合花名册中男性成员的年龄总和。它使用Stream.sum归约操作:
Integer totalAge = roster
.stream()
.mapToInt(Person::getAge)
.sum();
将此与以下管道进行比较,后者使用 Stream.reduce 操作来计算相同的值:
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
本例中的 reduce 操作有两个参数:
identity:标识元素既是归约的初始值,也是流中没有元素时的默认结果。在本例中,身份元素为 0;这是年龄总和的初始值,如果集合名册中没有成员,则为默认值。
accumulator:accumulator 函数有两个参数:归约的部分结果(在这个例子中,到目前为止所有已处理整数的总和)和流的下一个元素(在这个例子中,一个整数)。它 returns 一个新的部分结果。在此示例中,累加器函数是一个 lambda 表达式,它将两个整数值和 returns 一个整数值相加:
(a, b) -> a + b
reduce 操作总是returns 一个新值。但是,累加器函数每次处理流的元素时也会 returns 一个新值。假设您要将流的元素缩减为更复杂的对象,例如集合。这可能会影响应用程序的性能。如果您的 reduce 操作涉及将元素添加到集合中,那么每次您的累加器函数处理一个元素时,它都会创建一个包含该元素的新集合,这是低效的。相反,更新现有集合会更有效。您可以使用下一节介绍的 Stream.collect 方法来完成此操作。
oracle官方教程描述了Stream.reduce是如何工作的。请看一下,我相信它会回答你的问题。