什么是Java相当于Python的reduce函数?

时间:2015-01-08 14:03:07

标签: java python function lambda functional-programming

已经提出了类似的问题,herehere,但鉴于Java 8的出现,以及这些问题的普遍过时的性质,我想知道现在是否至少有一些东西亲切的呢?

This就是我指的。

3 个答案:

答案 0 :(得分:5)

您可以使用lambda和Stream.reduce,专用于reductions的文档中有一个页面:

Integer totalAgeReduce = roster
   .stream()
   .map(Person::getAge)
   .reduce(
       0,
       (a, b) -> a + b);

答案 1 :(得分:3)

这是用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());

答案 2 :(得分:2)

  

Stream.reduce方法

Stream.reduce方法是一种通用的还原操作。考虑以下管道,它计算男性成员的总和&#39;收集名册中的年龄。它使用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:如果流中没有元素,则identity元素既是缩小的初始值又是默认结果。在此示例中,identity元素为0;如果集合名单中没有成员,则这是年龄总和的初始值和默认值。

accumulator:累加器函数有两个参数:缩减的部分结果(在本例中,到目前为止所有处理过的整数的总和)和流的下一个元素(在本例中为整数)。它返回一个新的部分结果。在此示例中,accumulator函数是一个lambda表达式,它添加两个Integer值并返回一个Integer值:

(a, b) -> a + b

reduce操作始终返回一个新值。但是,累加器函数每次处理流的元素时也会返回一个新值。假设您要将流的元素减少为更复杂的对象,例如集合。这可能会妨碍您的应用程序的性能。如果reduce操作涉及向集合添加元素,那么每次accumulator函数处理元素时,它都会创建一个包含元素的新集合,这是低效的。相反,更新现有集合会更有效。您可以使用Stream.collect方法执行此操作,下一节将介绍该方法。

官方oracle教程描述了Stream.reduce的工作原理。请看一下,我相信它会回答您的问题。