您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页如何优雅使用JDK8中的Stream对list集合中的某值求和

如何优雅使用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有三个重载的方法:

一个参数

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一起使用,提高效率。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务