java8 collectors_java8的Collectors.reducing()

若v1是null的话,那就说明operationInfos集合里面是有null的,因为是要根据OperationCountVO的cityId进行分组,那OperationCountVO一定不为null,建议前面直接加filter过滤掉

Map 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 surgeryCountMerge = (v1, v2) -> {

v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount());

return v1;

}

这样下面代码就可以改成

Map collect = operationInfos.stream()

.filter(Objects::nonNull)

.collect(Collectors.groupingBy(OperationCountVO::getCityId,

Collectors.reducing(new OperationCountVO(), surgeryCountMerge));

这样写了之后,其实发现题主可能做麻烦了点,最后不就是为了返回一个Map嘛,所以建议不使用groupingBy,毕竟分组返回结果是一对多这样的结构,不是一对一的结构,那直接使用toMap嘛,直接点

Map collect = operationInfos.stream()

.filter(Objects::nonNull)

.collect(Collectors.toMap(OperationCountVO::getCityId, Function.identity(), surgeryCountMerge));

这样快多了噻,还不会报错,哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值