背景
针对两个或者多个List,(即使他们内部维护的类型不同也可以)根据某个唯一的属性,比如id,name,进行类似join 操作,即分组操作。这在Spark SQL中(转为DateFrame,注册成几张表) 或者 SQL语句中很容易实现,但是在java中却没有方法可以直接完成,那么可以参考以下的方式。
转化为Map对象
首先将 list 转化为 Map 对象,以list中的某个或某几个属性作为 key,list中的对象作为 value
在 java8 中可以使用 Stream 操作快速完成
Map commonMap = entityList.stream().collect(Collectors.toMap(x->x.getName()+x.getId(), Function.identity()));
collect():接收一个 Collector super T, A, R> collector 作为参数,返回一个新的集合
Collectors.toMap():接收键值对 Function super T, ? extends K> keyMapper, Function super T, ? extends U> valueMapper 作为参数,
Function.identity():表示将当前输入对象直接返回,在这里就是 entityList 中的每一个 Entity 对象
场景一
只有两个list 的情况:
将第二个list 中的属性和第一个list 中的属性整合:
// 将第一个list 转化为map 之后,遍历第二个list,拷贝属性
for (Entity entity: entityList) {
BeanUtils.copyProperties(commonMap .get( x.getName()+x.getInstance() ), entity);
}
场景二
有多个list 的情况:
将全部list 按上述方式转换为 map 之后,对所有 map 的 key 求并集,然后遍历所有的 key 对每个map 依次取值即可。