合并两个集合, 对集合中id相同的对象的属性进行合并

 前提: 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));
    }
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道不平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值