一、平民求法
求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一起使用,提高效率。