Maison  >  Questions et réponses  >  le corps du texte

java-ee - java8的Collectors.reducing()

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 ?

三叔三叔2635 Il y a quelques jours1255

répondre à tous(1)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-07-03 11:45:35

    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

    répondre
    0
  • Annulerrépondre