如果要對List中的對象進行唯一值屬性去重,屬性求和:
比如:對(“id1”, 1, 1),(“id2”,2,3),(“id1”,4,4),進行合並,合並后的結果是(“id1”, 5, 5),(“id2”,2,3)
public class DemeoDto{
private int id;
private int num1;
private int num2;
private String code1;
private String code2;
private String code3;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public String getCode1() {
return code1;
}
public void setCode1(String code1) {
this.code1 = code1;
}
public String getCode2() {
return code2;
}
public void setCode2(String code2) {
this.code2 = code2;
}
public String getCode3() {
return code3;
}
public void setCode3(String code3) {
this.code3 = code3;
}
}
1.key唯一,key是實體類的一個字段,比如以Id為key,進行合並,代碼如下
List<DemoDto> result = list.stream().collect(Collectors.toMap(DemoDto :: getId, a->a, (o1,o2)->{
o1.setNum1(o1.getNum1()+o2.getNum1());
o1.setNum2(o1.getNum2() + o2.getNum2());
o1.setCode1(o1.getCode1() + o2.getCode1());
return o1;
})).values().stream().collect(Collectors.toList());
2.key由多個字段組合而成,比如key = formDto.get1Code() + "_" + formDto.get2Code() + "_" + formDto.get3Code();
/**
* 實現list對象的屬性合並(key是組合的鍵,多個字段拼接)
* @param list
* @return
*/
public List<DemoDto> mergeList(List<DemoDto> list){
Map<String, DemoDto> map = new HashMap<>();
for(DemoDto formDto : list){
String key = formDto.get1Code() + "_" + formDto.get2Code() + "_" + formDto.get3Code();
if ( map.containsKey(key)){
DemoDto DemoDtoTemp = map.get(key);
DemoDtoTemp.setNum1(DemoDtoTemp.getNum1() + formDto.getNum1());
DemoDtoTemp.setNum2(DemoDtoTemp.getNum2() + formDto.getNum2());
DemoDtoTemp.setC(DemoDtoTemp.getC() + formDto.getC());
}else {
map.put(key,formDto);
}
}
//將map轉成List
List<DemoDto> result = map.values().stream().collect(Collectors.toList());
return result;
}