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是如何工作的。请看一下,我相信它会回答你的问题。