Rumah  >  Soal Jawab  >  teks badan

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

Mungkin saya mahu mengumpulkan koleksi operationInfos mengikut cityId di dalam, dan kemudian jika cityId adalah sama, tambah SurgeryCount objek dan kembalikannya, tetapi kini v1 pertama adalah batal,
Laksanakan v1.setSurgeryCount(v1. getSurgeryCount() + v2.getSurgeryCount());

三叔三叔2635 hari yang lalu1258

membalas semua(1)saya akan balas

  • 伊谢尔伦

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

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

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

    Saya baru komen dan dapat tahu... Kemungkinan punca ralat mungkin kerana Collectors.reducing中的第一个参数为new OperationCountVO(),若new出来的OperationCountVO对象的surgeryCountInteger类型,不是基本类型的话,所以没有初始化,surgeryCount就为null,在做v1.getSurgeryCount() + v2.getSurgeryCount()ralat mungkin dilaporkan semasa operasi

    (ps: Untuk reducing中的第二个参数BinaryOperator,最好还是封装到OperationCountVO objek, nampaknya kod itu lebih deklaratif... Terlalu hodoh untuk menulis kod seperti ini... Haha... Atau lebih baik menulisnya dan menulisnya sebagai akhir statik berubah-ubah, supaya ia boleh dipanggil di mana-mana )

    Sebagai contoh, tambahkan yang baharu terus ke kategori iniSurgeryCount属性合并的BinaryOperator,名字就叫surgeryCountMerge

    public static final BinaryOperator<OperationCountVO> surgeryCountMerge = (v1, v2) -> {
        v1.setSurgeryCount(v1.getSurgeryCount() + v2.getSurgeryCount());
        return v1;
    }

    Kod berikut boleh ditukar kepada

    Map<Integer, OperationCountVO> collect = operationInfos.stream()
            .filter(Objects::nonNull)
            .collect(Collectors.groupingBy(OperationCountVO::getCityId,
                                    Collectors.reducing(new OperationCountVO(), surgeryCountMerge));

    Selepas menulis ini, saya sebenarnya mendapati bahawa penulis soalan mungkin mempunyai sedikit masalah untuk melakukannya, akhirnya, ia hanya untuk mengembalikan Map嘛,所以建议不使用groupingBy,毕竟分组返回结果是一对多这样的结构,不是一对一的结构,那直接使用toMap, jadi klik sahaja

    Map<Integer, OperationCountVO> collect = operationInfos.stream()
            .filter(Objects::nonNull)
            .collect(Collectors.toMap(OperationCountVO::getCityId, Function.identity(), surgeryCountMerge));

    Ini lebih pantas dan tiada ralat akan dilaporkan, haha

    balas
    0
  • Batalbalas