java Stream Map集合处理

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的分组合并操作
https://www.jianshu.com/p/1f2b959e8e68

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值