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;
})));
Wahrscheinlich m?chte ich die operationInfos-Sammlung nach der darin enthaltenen cityId gruppieren und dann, wenn die cityId dieselbe ist, den SurgeryCount des Objekts hinzufügen und zurückgeben, aber jetzt ist die erste v1 null,
Execute v1.setSurgeryCount(v1. getSurgeryCount() + v2.getSurgeryCount()); hat einen Nullzeiger gemeldet. Stimmt etwas mit der Stelle, an der ich ihn geschrieben habe?
若v1
是null
的話,那就說明operationInfos
集合里面是有null
的,因為是要根據(jù)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;
})));
剛評論發(fā)現(xiàn)...可能報錯原因還有可能是,Collectors.reducing
中的第一個參數(shù)為new OperationCountVO()
,若new
出來的OperationCountVO
對象的surgeryCount
為Integer
類型,不是基本類型的話,所以沒有初始化,surgeryCount
就為null
,在做v1.getSurgeryCount() + v2.getSurgeryCount()
操作的時候就可能報錯了呀
(ps:對于reducing
中的第二個參數(shù)BinaryOperator
,最好還是封裝到OperationCountVO
對象中,看起來代碼更聲明式一點...這樣寫代碼太丑了...哈哈...或者寫出來,寫成一個靜態(tài)final變量更好,到時候可以到處調(diào)用嘛)
比如直接在本類上新增一個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));
這樣寫了之后,其實發(fā)現(xiàn)題主可能做麻煩了點,最后不就是為了返回一個Map
嘛,所以建議不使用groupingBy
,畢竟分組返回結(jié)果是一對多這樣的結(jié)構(gòu),不是一對一的結(jié)構(gòu),那直接使用toMap
嘛,直接點
Map<Integer, OperationCountVO> collect = operationInfos.stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(OperationCountVO::getCityId, Function.identity(), surgeryCountMerge));
這樣快多了噻,還不會報錯,哈哈