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

4

我希望通过reduce方法对List<Integer>中的所有元素进行求和。

在Scala中,我可以这样写:

val result = list.reduce(_ + _)

有没有一种更简洁的方法在Java8中编写此操作?还是我应该按照这种方式编写?
int result = list.reduce((x,y) -> x + y));
3个回答

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 

3
您可以使用预定义的sum()方法来对IntStream进行求和操作:
int result = list.stream().mapToInt(Integer::intValue).sum();

0
你在问题中展示的方式(`(x,y) -> x + y`)是lambda表达式最简洁的形式。
对于装箱基本类型的类,有一些静态方法可以执行一些算术操作,但并非所有都可用。那些存在的可以使用方法引用,例如`Integer::sum`。
另一种方式是自己定义一个函数并将其传递到方法中:
public static final BinaryOperator<Integer> SUM = Integer::sum;
...
list.reduce(SUM)

这种方式在使用时略微更简洁,但您可以自行决定是否需要提前编写所有所需函数的前期成本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接