java-ee - java8的Collectors.reducing()
问题描述
Map<Integer, OperationCountVO> collect = operationInfos.stream().collect(Collectors.groupingBy(OperationCountVO::getCityId, Collectors.reducing(new OperationCountVO(), (OperationCountVO v1, OperationCountVO v2) -> {v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount());v1.setCityId(v2.getCityId());return v1; })));
大概就是我想对operationInfos集合按照里面的cityId进行分组,然后cityId一样的话,把对象的SurgeryCount加起来返回,但是现在 第一次的v1是null,执行v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount());的时候报了空指针,我哪里写的有问题吗?
问题解答
回答1:若v1是null的话,那就说明operationInfos集合里面是有null的,因为是要根据OperationCountVO的cityId进行分组,那OperationCountVO一定不为null,建议前面直接加filter过滤掉
Map<Integer, OperationCountVO> collect = operationInfos.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(OperationCountVO::getCityId, Collectors.reducing(new OperationCountVO(), (OperationCountVO v1, OperationCountVO v2) -> {v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount());v1.setCityId(v2.getCityId());return v1; })));
刚评论发现...可能报错原因还有可能是,Collectors.reducing中的第一个参数为new OperationCountVO(),若new出来的OperationCountVO对象的surgeryCount为Integer类型,不是基本类型的话,所以没有初始化,surgeryCount就为null,在做v1.getSurgeryCount() + v2.getSurgeryCount()操作的时候就可能报错了呀
(ps:对于reducing中的第二个参数BinaryOperator,最好还是封装到OperationCountVO对象中,看起来代码更声明式一点...这样写代码太丑了...哈哈...或者写出来,写成一个静态final变量更好,到时候可以到处调用嘛)
比如直接在本类上新增一个SurgeryCount属性合并的BinaryOperator,名字就叫surgeryCountMerge
public static final BinaryOperator<OperationCountVO> surgeryCountMerge = (v1, v2) -> { v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount()); return v1;}
这样下面代码就可以改成
Map<Integer, OperationCountVO> collect = operationInfos.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(OperationCountVO::getCityId,Collectors.reducing(new OperationCountVO(), surgeryCountMerge));
这样写了之后,其实发现题主可能做麻烦了点,最后不就是为了返回一个Map嘛,所以建议不使用groupingBy,毕竟分组返回结果是一对多这样的结构,不是一对一的结构,那直接使用toMap嘛,直接点
Map<Integer, OperationCountVO> collect = operationInfos.stream().filter(Objects::nonNull).collect(Collectors.toMap(OperationCountVO::getCityId, Function.identity(), surgeryCountMerge));
这样快多了噻,还不会报错,哈哈
相关文章:
1. docker gitlab 如何git clone?2. font-family - 我引入CSS3自定义字体没有效果?3. android - 目前有哪些用Vue.js开发移动App的方案?4. docker start -a dockername 老是卡住,什么情况?5. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!6. objective-c - iOS开发支付宝和微信支付完成为什么跳转到了之前开发的一个app?7. PHP中的$this代表当前的类还是方法?8. docker images显示的镜像过多,狗眼被亮瞎了,怎么办?9. java - 我用Tomcat访问SQL server数据库时,出现以下错误,该怎么解决?10. angular.js - 求一款angular插件