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