需求:按照特定条件,将集合中的元素做分类合并。
举例:
[{item:"a",
code:"code1",
num:10,
sum:20}
,
{item:"a",
code:"code2",
num:5,
sum:15}
}
,
{item:"b",
code:"code3",
num:10,
sum:20}]
将item相同的元素的num值和sum值合并,则合并结果为:
[{item:"a",
code:"code1",
num:15,
sum:35}
,
{item:"b",
code:"code3",
num:10,
sum:20}]
代码实现
@Data
public class Entity {
private String item;
private String code;
private int num;
private int sum;
}
private List<Entity> merge(){
Entity entity1 = new Entity("a", "code1", 10, 20);
Entity entity2 = new Entity("a", "code2", 5, 15);
Entity entity3 = new Entity("b", "code3", 10, 20);
ArrayList<Entity> entities = new ArrayList<>();
entities.add(entity1);
entities.add(entity2);
entities.add(entity3);
ArrayList<Entity> entitiesMerge = new ArrayList<>(entities.stream().collect(Collectors.toMap(Entity::getItem, a -> a, (i1, i2) -> {
i1.setNum(i1.getNum() + i2.getNum());
i1.setSum(i1.getSum() + i2.getSum());
return i1;
})).values());
// 另一种方法
List<Entity> newEntities = new ArrayList<>();
entities.parallelStream().collect(Collectors.groupingBy(Entity::getItem, Collectors.toList())).forEach((id, module) -> {
module.stream().reduce((a, b) -> {
a.setNum(a.getNum() + b.getNum());
a.setSum(a.getSum() + b.getSum());
return a;
}
).ifPresent(newEntities ::add);
});
System.out.println(entities);
return entitiesMerge;
}
得到entitiesMerge 的值为
Entity{item='a', code='code1', num=15, sum=35}
Entity{item='b', code='code3', num=10, sum=20}