如何在Java中合并同类型对象列表?(含非空属性合并示例)
合并两个Java对象的非空属性实现完整对象
嘿,这个需求其实挺常见的,我来给你几种实用的实现方式,完全适配你的场景(两个列表各存一个对象):
首先,先定义咱们的实体类,假设是Person:
public class Person { private String name; private Integer age; private Integer weight; // 省略无参/全参构造器、getter、setter、toString方法 }
方法一:手动属性赋值(适合属性少的场景)
如果你的实体类属性不多,手动判断每个属性是否为空是最直接、最不容易出问题的方式:
// 先从两个列表中取出目标对象 Person a = listA.get(0); Person b = listB.get(0); // 创建合并后的新对象 Person merged = new Person(); // 逐个属性判断:优先取a的非空值,a为空则取b的值 merged.setName(a.getName() != null ? a.getName() : b.getName()); merged.setAge(a.getAge() != null ? a.getAge() : b.getAge()); merged.setWeight(a.getWeight() != null ? a.getWeight() : b.getWeight()); // 输出结果就是你要的[name=abc, age=56, weight=70] System.out.println(merged);
这种方式的好处是逻辑清晰、调试方便,完全不需要依赖第三方库,适合属性数量少的实体类。
方法二:反射实现通用合并(适合属性多的场景)
如果你的实体类有很多属性,手动写判断会很繁琐,这时候可以用反射来做通用的合并逻辑:
public static <T> T mergeObjects(T source, T target) throws IllegalAccessException { // 获取类的所有字段(包括私有字段) Field[] fields = source.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object value = field.get(source); // 如果源对象的属性非空,就赋值给目标对象 if (value != null) { field.set(target, value); } } return target; } // 使用方式 Person a = listA.get(0); Person b = listB.get(0); // 先把a的非空属性合并到新对象,再补入b中a没有的非空属性 Person merged = mergeObjects(a, new Person()); merged = mergeObjects(b, merged); System.out.println(merged);
这个方法的优势是通用性强,不管实体类有多少属性,都可以复用这段代码。不过要注意反射的性能开销(一般业务场景下可以忽略),还有要处理IllegalAccessException异常。
方法三:用第三方工具库简化代码
如果你不想自己写重复代码,可以用成熟的第三方库来实现,比如Spring BeanUtils(很多Java项目本身就依赖Spring),我们可以封装一个跳过空值的复制方法:
import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; public static void copyNonNullProperties(Object source, Object target) { BeanWrapper srcWrapper = new BeanWrapperImpl(source); BeanWrapper targetWrapper = new BeanWrapperImpl(target); for (String propertyName : srcWrapper.getPropertyDescriptors()) { Object value = srcWrapper.getPropertyValue(propertyName); if (value != null) { targetWrapper.setPropertyValue(propertyName, value); } } } // 使用方式 Person merged = new Person(); copyNonNullProperties(listA.get(0), merged); copyNonNullProperties(listB.get(0), merged); System.out.println(merged);
总结一下:
- 属性少:选手动赋值,简单直观
- 属性多:选反射或第三方库,减少重复代码
- 项目已有Spring依赖:直接用上面封装的Spring工具方法,更省心
内容的提问来源于stack exchange,提问作者Puspanjali Padhy
相关产品推荐
相关产品推荐

