Maison > Questions et réponses > le corps du texte
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;
})));
Je souhaite probablement regrouper la collection operationInfos en fonction du cityId à l'intérieur, puis si le cityId est le même, ajouter le SurgeryCount de l'objet et le renvoyer, mais maintenant le premier v1 est nul,
Exécuter v1.setSurgeryCount(v1. getSurgeryCount() + v2.getSurgeryCount()); a signalé un pointeur nul, y a-t-il un problème avec l'endroit où je l'ai écrit ?
伊谢尔伦2017-07-03 11:45:35
Si v1
是null
的话,那就说明operationInfos
集合里面是有null
的,因为是要根据OperationCountVO
的cityId
进行分组,那OperationCountVO
一定不为null,建议前面直接加filter
filtre
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;
})));
Je viens de commenter et de découvrir... La raison possible de l'erreur peut être que Collectors.reducing
中的第一个参数为new OperationCountVO()
,若new
出来的OperationCountVO
对象的surgeryCount
为Integer
类型,不是基本类型的话,所以没有初始化,surgeryCount
就为null
,在做v1.getSurgeryCount() + v2.getSurgeryCount()
l'erreur peut être signalée pendant le fonctionnement
(ps : Pour les objets reducing
中的第二个参数BinaryOperator
,最好还是封装到OperationCountVO
, il semble que le code soit plus déclaratif... C'est trop moche d'écrire du code comme ça... Haha... Ou il vaut mieux l'écrire et l'écrire comme une finale statique variable, pour qu'elle puisse être appelée partout)
Par exemple, ajoutez-en un nouveau directement dans cette catégorieSurgeryCount
属性合并的BinaryOperator
,名字就叫surgeryCountMerge
public static final BinaryOperator<OperationCountVO> surgeryCountMerge = (v1, v2) -> {
v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount());
return v1;
}
Le code suivant peut être modifié en
Map<Integer, OperationCountVO> collect = operationInfos.stream()
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(OperationCountVO::getCityId,
Collectors.reducing(new OperationCountVO(), surgeryCountMerge));
Après avoir écrit ceci, j'ai en fait découvert que l'auteur de la question avait peut-être un peu de mal à le faire. Au final, c'était juste pour renvoyer un Map
嘛,所以建议不使用groupingBy
,毕竟分组返回结果是一对多这样的结构,不是一对一的结构,那直接使用toMap
, alors cliquez simplement sur
Map<Integer, OperationCountVO> collect = operationInfos.stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(OperationCountVO::getCityId, Function.identity(), surgeryCountMerge));
C'est beaucoup plus rapide et aucune erreur ne sera signalée, haha