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());的时候报了空指针,我哪里写的有问题吗?
若
v1
是null
的话,那就说明operationInfos
集合里面是有null
的,因为是要根据OperationCountVO
的cityId
进行分组,那OperationCountVO
一定不为null,建议前面直接加filter
过滤掉刚评论发现...可能报错原因还有可能是,
Collectors.reducing
中的第一个参数为new OperationCountVO()
,若new
出来的OperationCountVO
对象的surgeryCount
为Integer
类型,不是基本类型的话,所以没有初始化,surgeryCount
就为null
,在做v1.getSurgeryCount() + v2.getSurgeryCount()
操作的时候就可能报错了呀(ps:对于
reducing
中的第二个参数BinaryOperator
,最好还是封装到OperationCountVO
对象中,看起来代码更声明式一点...这样写代码太丑了...哈哈...或者写出来,写成一个静态final变量更好,到时候可以到处调用嘛)比如直接在本类上新增一个
SurgeryCount
属性合并的BinaryOperator
,名字就叫surgeryCountMerge
这样下面代码就可以改成
这样写了之后,其实发现题主可能做麻烦了点,最后不就是为了返回一个
Map
嘛,所以建议不使用groupingBy
,毕竟分组返回结果是一对多这样的结构,不是一对一的结构,那直接使用toMap
嘛,直接点这样快多了噻,还不会报错,哈哈