在Java 8中编写算术运算函数的简明方法

时间:2014-11-13 08:15:28

标签: java functional-programming java-8

我想通过reduce。

来汇总List<Integer>中的所有元素

在Scala我可以写

val result = list.reduce(_ + _)

有没有办法在Java8中以如此简洁的方式编写此操作?或者我应该这样写?

int result = list.reduce((x,y) -> x + y));

3 个答案:

答案 0 :(得分:7)

如果您特别想使用reduce,则可以执行以下操作:

list.stream().reduce(0, Integer::sum);  // will return zero if list is empty
list.stream().reduce(Integer::sum).get(); // will throw an exception if list is empty

由于求和很常见,有几种方法可以做到:

list.stream().mapToInt(x->x).sum();      // mapToInt makes an IntStream
list.stream().collect(summingInt(x->x)); // using a collector 

答案 1 :(得分:3)

您可以使用sum()的预定义IntStream

int result = list.stream().mapToInt(Integer::intValue).sum();

答案 2 :(得分:0)

您在问题中显示的方式((x,y) -> x + y))与lambdas一样简洁。

盒装基元的类具有执行某些算术运算的静态方法,但并非所有算法都可用。存在的那些可以与方法参考一起使用,例如Integer::sum

另一种方法是自己定义一个函数并将其传递给方法:

public static final BinaryOperator<Integer> SUM = Integer::sum;
...
list.reduce(SUM)

这种方式在使用网站上稍微简洁一些,但您可以决定是否需要预先记录所有需要抵消的功能。