Rumah > Soal Jawab > teks badan
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());
伊谢尔伦2017-07-03 11:45:35
Jika v1
是null
的话,那就说明operationInfos
集合里面是有null
的,因为是要根据OperationCountVO
的cityId
进行分组,那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
对象的surgeryCount
为Integer
类型,不是基本类型的话,所以没有初始化,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