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

三叔
三叔

membalas semua(1)
伊谢尔伦

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan