数据库查找的结果经常会有List等集合,而集合中存放法是JAVA对象,对象中存在BigDecimal的字段,如果用for或者iterator遍历来累加感觉很麻烦,stream聚合函数很好的解决了这个问题.做个笔记mark一下
POJO
package test;
import java.math.BigDecimal;
/** * 用户实体类 * * @author suddev * @create 2018-02-26 上午11:03 **/
public class User {
private long id;
private BigDecimal money;
public User(long id, BigDecimal money) {
this.id = id;
this.money = money;
}
// getter&setter
}
在实体类中,我们可以看到实体存在一个为BigDecimal的money属性,以计算所有查询出来的用户金钱总额为例子:
package test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/** * 测试类 * * @author suddev * @create 2018-02-26 上午11:03 **/
public class Test {
public static void main(String[] args) {
// 准备数据
List<User> userList = new ArrayList<User>();
for (int i = 0; i < 100; i++) {
User user = new User(i,new BigDecimal(i+"."+i));
userList.add(user);
}
// for version
BigDecimal result1 = BigDecimal.ZERO;
for (User user : userList) {
result1 = result1.add(user.getMoney());
}
System.out.println("result1 = "+result1);
// java 8 stream version
BigDecimal result2 = userList.stream()
// 将user对象的mongey取出来map为Bigdecimal
.map(User::getMoney)
// 使用reduce聚合函数,实现累加器
.reduce(BigDecimal.ZERO,BigDecimal::add);
System.out.println("result2 = "+result2);
}
}
map是一个对于流对象的中间操作,通过给定的方法,它能够把流对象中的每一个元素对应到另外一个对象上,这里将user对象的money取出来map为Bigdecimal
reduce是一个终结操作,它能够通过某一个方法,对元素进行削减操作。该操作的结果会放在一个Optional变量里返回。可以利用它来实现很多聚合方法比如count,max,min等。
这里利用了reduce的第二个方法重载
T reduce(T identity, BinaryOperator accumulator);
第一个参数是我们给出的初值,第二个参数是累加器,可以自己用实现接口完成想要的操作,这里使用Bigdecimal的add方法
最后reduce会返回计算后的结果
参考文档:
Java 8系列之Stream中万能的reduce
Adding up BigDecimals using Streams