有的时候从数据库里面查出来的不同list包含配置类的结果集需要进行合并,也就是把多个list根据某一个属性合并成一个list,并且要把独有属性也合并在一起(指的是如果list里的modal根据某个属性合并的话,那么拥有这个属性同一值的两个实体类其他属性会互补,为null则取对方的)
接下来的是代码
List<ClaimDerive> resultList = Stream.of(sumClaimList, sumPayList, sumRepurchList)
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(ClaimDerive::getMachineNo))
.values()
.stream()
.map(claimDeriveList -> {
ClaimDerive resultClaimDerive = new ClaimDerive();
resultClaimDerive.setMachineNo(claimDeriveList.get(0).getMachineNo());
claimDeriveList.forEach(resultClaimDerive::merge);
return resultClaimDerive;
})
.collect(Collectors.toList());
public class ClaimDerive {
private String machineNo;
private String name;
private String address;
// 省略getter和setter方法
public void merge(ClaimDerive claimDerive) {
if (this.name == null) {
this.name = claimDerive.getName();
}
if (this.address == null) {
this.address = claimDerive.getAddress();
}
}
}
这里的sumClaimList、sumPayList、sumRepurchList就是本人所需要合并的三个list,ClaimDerive就是list里面包含的实体类。这三个list根据machineNo来进行分组合并。最后合成出来的list会是根据machineNo的并集。实体类里的merge就是合并独有属性的方法,判断该属性是否为Null,为Null则取对方的。
此外还需要注意内存,在java内存中使用stream流来分组和处理数据的话速度虽然很快,但是要注意数据量的大小,数据量太大的话可能会导致内存溢出。(当然指的是一个list几万条以上的那种)