You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:34:08