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

三叔
三叔

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

Si v1null的话,那就说明operationInfos集合里面是有null的,因为是要根据OperationCountVOcityId进行分组,那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对象的surgeryCountInteger类型,不是基本类型的话,所以没有初始化,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

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!