java Stream 使用
stream对Map集合的处理
1 Map x 处理成 Map y 简单示例:
Map<String, String> x;
Map<String, Integer> y =
x.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey(),
e -> Integer.parseInt(e.getValue())
));
2 计算List<Map<String,String>>中所有map的value的sum:
数据结构:
list ( map(“商品id”,“100”))
list ( map(“商品id”,“200”))
求所有商品价格 100+200 =300
stream处理两层集合:
List<Map<String,Double>> amountList=baseMapper.get(...);
Double dTotal =amountList.stream().map(
m->m.entrySet().stream()
.filter(e->"amount".equals(e.getKey()))
.map(e->{
Object o=e.getValue();
Double d=Double.parseDouble(o.toString());
return d;
})
.reduce(0d,(a,b)->a+b)
). reduce(0d,(a,b)->a+b);
System.out.println("商品总金额:"+dTotal);
1 先对外层list进行map
2 对内层Map集合 filter 过滤key(key为金额的)
再对Map集合进行map,将map<key,value> 在map方法中转为 一个数据元素
3 对内层map完的流进行reduce,得到一个map集合内的value的sum
4 对外层list集合map的元素reduce,得到所有Map的value的sum
其他实现方式:
1 reduce也可以换成collect,在外层collect中进行聚合:
内层reduce–> .collect(Collectors.toList())
外层reduce–>).collect(Collectors.summarizingDouble(e->e));
最终结果再getSum()
2 map都换成mapToDouble
reduce换成.sum()
Double dTotal =amountList.stream().mapToDouble(
m->m.entrySet().stream()
.filter(e->"amount".equals(e.getKey()))
.mapToDouble(e->{
Object o=e.getValue();
Double d=Double.parseDouble(o.toString());
return d;
})
.sum()
). sum();
聚合可以用处理方法reduce,也可以用数值流mapToDouble,也可以用收集集合collect里的聚合方法。
实现过程中整理了stream流生命周期各个节点和方法,比较全的结构了:
来源:
https://www.jianshu.com/p/0bb4daf6c800
https://www.jianshu.com/p/e429c517e9cb
另:
java8使用stream计算map集合的值和
https://blog.csdn.net/u012269637/article/details/100934966
Java8新特性-Stream API 常用完整版
https://blog.csdn.net/hxhaaj/article/details/80725857#2333-summingdouble-%E6%B1%82%E5%92%8C%E5%B9%B6%E8%BD%AC%E6%8D%A2%E6%88%90double%E7%B1%BB%E5%9E%8B
java8 Stream 对List