我刚接触 Java 8
,并找到了一些实现加法
、乘法
和减法
的方法。我想问如何只进行加法
。
我写了下面这段代码,并将输出结果分别存储在 Sum1 和 Sum2 中。两种方法 reduce(0, Integer::sum)
和 .reduce(0, (a, b) -> a+b);
得到的结果相同。从性能角度来看,使用哪种方法最好?如果使用大整数值,应该选择哪种方法?为什么?
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
Integer sum1 = numbers.stream().reduce(0, (a, b) -> a+b);
System.out.println("SUM ="+sum1);
Integer product = numbers.stream().reduce(0, (a, b) -> a*b);
System.out.println("PRODUCT = "+product);
int sum2 = numbers.stream().reduce(0, Integer::sum);
System.out.println("SUM 2= "+sum2);
Optional<Integer> sum3 = numbers.stream().reduce((a, b) -> (a + b));
System.out.println("SUM3="+sum3);
// Updated as per @Hadi J comment
int sum4 = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println("Sum ="+sum4);
numbers.stream().mapToInt(Integer::intValue).sum();
,因为reduce
存在多个自动装箱。 - Hadi Jreduce(0, Integer::sum)
和reduce((a, b) -> a + b)
之间没有区别。对于第一个,每次评估都会调用Integer.sum(…)
方法,对于第二个,将调用在您的类中创建的方法,该方法完全相同,即return a+b;
。这些考虑与Function.identity()或t->t类似。虽然我们这里没有共享生成的实例(但是),调用现有方法可以减少代码并提高最终优化共享代码的可能性,但可能会妨碍调试。 - Holger