如何使用Java 8 Stream对BigInteger列表求和?
使用Java 8 Stream对List求和
当然可以用Java 8 Stream来实现这个需求,而且写法比循环更简洁直观!
先回顾一下你原来的循环实现,逻辑很清晰:
List<BigInteger> listOfNumbers = new ArrayList<>(); // 填充listOfNumbers的代码... BigInteger sum = new BigInteger("0"); for(BigInteger num : listOfNumbers) { sum = sum.add(num); }
下面是两种用Stream实现的方式:
方式一:使用Stream.reduce()
这是最直接的替代方案,reduce方法专门用来将流中的元素累积合并成一个结果:
List<BigInteger> listOfNumbers = new ArrayList<>(); // 填充listOfNumbers的代码... BigInteger sum = listOfNumbers.stream() .reduce(BigInteger.ZERO, BigInteger::add);
这里的BigInteger.ZERO就是初始累加值(对应你循环里的new BigInteger("0")),BigInteger::add是方法引用,用来指定每一步的累加逻辑——把当前元素和当前的总和相加。
方式二:使用Collectors.reducing()
如果你习惯用Collector的方式来处理流的结果,也可以用Collectors.reducing:
BigInteger sum = listOfNumbers.stream() .collect(Collectors.reducing(BigInteger.ZERO, BigInteger::add));
这个方式和上面的reduce逻辑本质是一样的,只是用Collector的形式来封装了累积过程。
两种方式都能达到和循环一样的效果,而且写法更偏向声明式编程——你只需要告诉程序“我要求和”,不需要手动控制循环的执行细节。
内容的提问来源于stack exchange,提问作者bisarch
相关产品推荐
相关产品推荐

