前提: id相同的对象相同属性只有一个有值
如果存在id相同的对象同一个属性都有值, 后取到的对象会覆盖先取到的对象值
实体类:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 测试vo
*
* @author wd
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestVo {
private Integer id;
private String value;
private String value1;
}
封装合并方法:
public static List<TestVo> mergeListWithProperties(List<TestVo> list1, List<TestVo> list2) {
//(未作非null判断)都为空 随便返回一个
if (list1.size() == 0 && list2.size() == 0) return list1;
//有一个为空, 返回非空那个
if (list1.size() == 0 || list2.size() == 0) return list1.size() == 0 ? list2 : list1;
//合并集合
list1.addAll(list2);
//利用map的key作id重复判断
Map<Integer, TestVo> map = new HashMap<>();
for (TestVo vo : list1)
//如果map已经存在这个对象
if (map.containsKey(vo.getId())) {
TestVo mapVo = map.get(vo.getId());
//封装工具类扩展spring的BeanUtils拷贝属性(忽略null值)
BeanUtil.copyPropertiesIgnoreNull(vo, mapVo);
} else map.put(vo.getId(), vo);
Collection<TestVo> values = map.values();
list1.clear();
list1.addAll(values);
return list1;
}
测试:
public static void main(String[] args) throws InterruptedException {
List<TestVo> list1 = new ArrayList<>();
TestVo vo1 = new TestVo(1,"1",null);
TestVo vo2 = new TestVo(2,"1",null);
TestVo vo3 = new TestVo(3,"1",null);
list1.add(vo1);
list1.add(vo2);
list1.add(vo3);
List<TestVo> list2 = new ArrayList<>();
TestVo vo4 = new TestVo(1,null,"2");
TestVo vo5 = new TestVo(2,null,"2");
TestVo vo6 = new TestVo(3,null,"2");
list2.add(vo4);
list2.add(vo5);
list2.add(vo6);
List<TestVo> test = mergeListWithProperties(list1,list2);
for (TestVo vo : test) System.out.println(vo);
}
打印结果:
工具类BeanUtil如下:
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.util.HashSet;
import java.util.Set;
/**
* @author wd
*/
public class BeanUtil {
/**
* 获取对象中值为null的字段
*
* @return java.lang.String[]
* @author wd
* @date 2021/12/13
*/
public static String[] getNullPropertyNames(Object source) {
BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
/**
* 复制源对象中属性值到目标对象中(忽略源对象null值)
*
* @param src 源对象
* @param target 目标对象
* @author wd
* @date 2021/12/13
*/
public static void copyPropertiesIgnoreNull(Object src, Object target) {
BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}
}