java-ee - java8的Collectors.reducing()
三叔
三叔 2017-07-03 11:43:35
0
1
1205
Map 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 ?

三叔
三叔

répondre à tous (1)
伊谢尔伦

Siv1null的话,那就说明operationInfos集合里面是有null的,因为是要根据OperationCountVOcityId进行分组,那OperationCountVO一定不为null,建议前面直接加filterfiltre

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; })));

Je viens de commenter et de découvrir... La raison possible de l'erreur peut être queCollectors.reducing中的第一个参数为new OperationCountVO(),若new出来的OperationCountVO对象的surgeryCountInteger类型,不是基本类型的话,所以没有初始化,surgeryCount就为null,在做v1.getSurgeryCount() + v2.getSurgeryCount()l'erreur peut être signalée pendant le fonctionnement

(ps : Pour les objetsreducing中的第二个参数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 surgeryCountMerge = (v1, v2) -> { v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount()); return v1; }

Le code suivant peut être modifié en

Map 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 unMap嘛,所以建议不使用groupingBy,毕竟分组返回结果是一对多这样的结构,不是一对一的结构,那直接使用toMap, alors cliquez simplement sur

.
Map 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

    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!