如何优雅使用JDK8中的Stream对list集合中的某值求和

 一、平民求法

求OpportunityList中Amount的总和,一般写法为:

BigDecimal result = new BigDecimal();
for(i=0;i<opportunityList.size;i++){
  result = result + opportunityList.get(i).getAmount;
}

但是,可以使用JDK8新增的Stream的reduce方法一句话求出

二、优雅求法

BigDecimal result2 = userList.stream()
                // 将Opportunity对象的金额属性取出
                .map(Opportunity::getAmount)
                // 使用reduce()聚合函数,得到金额总和
                .reduce(BigDecimal.ZERO,BigDecimal::add);

三、Stream流之reduce方法解析

reduce:根据指定的计算模型将Stream中的值计算得到一个最终结果

reduce有三个重载的方法:

一个参数

Optional reduce(BinaryOperator accumulator); 该方法接受一个BinaryOperator<T>型的变量,返回Optional<T>的结果。 BinaryOperator<T>是一个函数式接口,代表一个在两个操作数上执行的操作,生成一个和操作数类型相同的结果。 Optional<T>是JDK8的一个特性,这是一个容器对象,可以包含或者不包含一个非空的值。get()方法将获取其包含的值,如果其不包含一个非空的值,get()将抛出异常。

两个参数

T reduce(T identity, BinaryOperator<T> accumulator) T identity自动处理Stream为空的情况和自定义初始值,如上面优雅的例子中,自动设置bigDecimal值为0

三个参数

<U> U reduce (U identity, BiFunction<U,? super [T],U> accumulator, BinaryOperator<U> combiner) 加入了BinaryOperator<U> combiner,提供了两项增强 1、可以返回同stream内元素类型不同的结果; 2、在并行条件下和parallelStream一起使用,提高效率。
经验分享 程序员 微信小程序 职场和发展