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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值