java 2个list合并,如果id相同的对象则属性合并到一起,不同id的对象也要保留

问题遇到的现象和发生背景

想要两个list合并成同一个list,然后再当前list中相同id属性的对象进行合并,不同的也要保留

用代码块功能插入代码,请勿粘贴截图
List<Info> list1 = new ArrayList<>();
        Info info1 = new Info();
        info1.setId(1);
        info1.setCount1(100);
        Info info2 = new Info();
        info2.setId(2);
        info2.setCount1(200);
        Info info3 = new Info();
        info3.setId(3);
        info3.setCount1(300);
        list1.add(info1);
        list1.add(info2);
        list1.add(info3);

        List<Info> list2 = new ArrayList<>();
        Info info4 = new Info();
        info4.setId(1);
        info4.setCount2(100);
        Info info5 = new Info();
        info5.setId(2);
        info5.setCount2(200);
        Info info6 = new Info();
        info6.setId(4);
        info6.setCount2(400);
        list2.add(info4);
        list2.add(info5);
        list2.add(info6);

 
@Data
public class Info{
    private Integer id;
    private BigDecimal count1;
    private BigDecimal count2;
}
 
我的解答思路和尝试过的方法

我尝试根据id合并为同一个list,但是不同id的无法保留下来
例 处理完的list:[Info(id=1, count1=100, count2=100), Info(id=2, count1=200, count2=200)]
之后在根据处理完的list跟原list1,list2取差集

我想要达到的结果

最好合并后都进行保留
[Info(id=1, count1=100, count2=100), Info(id=2, count1=200, count2=200), Info(id=3, count1=300, count2=null), Info(id=4, count1=null, count2=400)]

import lombok.Data;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Data
public class Info {
    private Integer id;
    private Integer count1;
    private Integer count2;

    public static void main(String[] args) {
        List<Info> list1 = new ArrayList<>();
        Info info1 = new Info();
        info1.setId(1);
        info1.setCount1(100);
        Info info2 = new Info();
        info2.setId(2);
        info2.setCount1(200);
        Info info3 = new Info();
        info3.setId(3);
        info3.setCount1(300);
        list1.add(info1);
        list1.add(info2);
        list1.add(info3);

        List<Info> list2 = new ArrayList<>();
        Info info4 = new Info();
        info4.setId(1);
        info4.setCount2(100);
        Info info5 = new Info();
        info5.setId(2);
        info5.setCount2(200);
        Info info6 = new Info();
        info6.setId(4);
        info6.setCount2(400);
        list2.add(info4);
        list2.add(info5);
        list2.add(info6);

        labe1:
        for (int i = 0; i < list2.size(); i++) {
            Info info_2 = list2.get(i);
            for (int j = 0; j < list1.size(); j++) {
                Info info_1 = list1.get(j);
                if (info_2.getId().equals(info_1.getId())) {
                    if (info_2.getCount1() != null) {
                        info_1.setCount1(info_2.getCount1());
                    }
                    if (info_2.getCount2() != null) {
                        info_1.setCount2(info_2.getCount2());
                    }
                    continue labe1;
                }
            }
            list1.add(info_2);
        }

        System.out.println(list1);
    }
}

public void concat() throws IllegalAccessException {

        List<Info> list1 = new ArrayList<>();
        Info infoItem1 = new VisitRecordController.Info();
        infoItem1.setId("1");
        infoItem1.setCount1(100);
        Info infoItem2 = new Info();
        infoItem2.setId("2");
        infoItem2.setCount1(200);
        Info info3 = new Info();
        info3.setId("3");
        info3.setCount1(300);
        list1.add(infoItem1);
        list1.add(infoItem2);
        list1.add(info3);

        List<Info> list2 = new ArrayList<>();
        Info info4 = new Info();
        info4.setId("1");
        info4.setCount2(100);
        Info info5 = new Info();
        info5.setId("2");
        info5.setCount2(200);
        Info info6 = new Info();
        info6.setId("4");
        info6.setCount2(400);
        list2.add(info4);
        list2.add(info5);
        list2.add(info6);

        Map<String, Info> infoMap = new HashMap();
        for (Info info1 : list1) {
            infoMap.put(info1.getId(), info1);
        }
        Info info1;
        List<Info> newInfo2List = new ArrayList<>();
        for (Info info2 : list2) {
            // 遍历第二集合,如果与第一集合某项id相同
            if (infoMap.containsKey(info2.getId())) {
                info1 = infoMap.get(info2.getId());
                // 反射遍历第二集合项的属性值
                for (Field field : info2.getClass().getDeclaredFields()) {
                    field.setAccessible(true);
                    // 如果第一集合项某属性值为空,而第二集合项该属性值不为空,则填入
                    if (field.get(info2) != null && field.get(info1) == null) {
                        field.set(info1, field.get(info2));
                    }
                }
            } else {
                // 将没有相同id的第二集合项放入新的集合
                newInfo2List.add(info2);
            }
        }
        list1.addAll(newInfo2List);
        System.out.println(list1);

    }

img

您的采纳就是对我最大的鼓励,谢谢!!!

img

不知道你解决了没?
如果没有解决,我们可以聊聊。


这个其实还好的,你直接遍历,然后根据条件判断即可。
如果有不明白的,我们可以交流交流。

如注释

package service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class MergeList {
    public static void main(String[] args) {
        List<Info> list1 = new ArrayList<>();
        Info info1 = new Info();
        info1.setId(1);
        info1.setCount1(new BigDecimal(100));
        Info info2 = new Info();
        info2.setId(2);
        info2.setCount1(new BigDecimal(200));
        Info info3 = new Info();
        info3.setId(3);
        info3.setCount1(new BigDecimal(300));
        list1.add(info1);
        list1.add(info2);
        list1.add(info3);

        List<Info> list2 = new ArrayList<>();
        Info info4 = new Info();
        info4.setId(1);
        info4.setCount2(new BigDecimal(100));
        Info info5 = new Info();
        info5.setId(2);
        info5.setCount2(new BigDecimal(200));
        Info info6 = new Info();
        info6.setId(4);
        info6.setCount2(new BigDecimal(400));
        list2.add(info4);
        list2.add(info5);
        list2.add(info6);

        //缓存不同部分
        List<Info> dif=new ArrayList<>();
        //是否存在的标志
        boolean exist;
        for (Info to : list1) {
            exist=false;
            //以list2为标准进行判重
            for (Info from : list2) {
                if (Objects.equals(to.getId(), from.getId())){
                    if (from.getCount1()==null){
                        from.setCount1(to.getCount1());
                    }
                    if (from.getCount2()==null){
                        from.setCount2(to.getCount2());
                    }
                    exist=true;
                }
            }
            if (!exist){
                dif.add(to);
            }
        }
        //合并不同部分
        list2.addAll(dif);
        System.out.println(list2);
    }




}

img


package service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class MergeList {
    public static void main(String[] args) {
        List<Info> list1 = new ArrayList<>();
        Info info1 = new Info();
        info1.setId(1);
        info1.setCount1(new BigDecimal(100));
        Info info2 = new Info();
        info2.setId(2);
        info2.setCount1(new BigDecimal(200));
        Info info3 = new Info();
        info3.setId(3);
        info3.setCount1(new BigDecimal(300));
        list1.add(info1);
        list1.add(info2);
        list1.add(info3);
        List<Info> list2 = new ArrayList<>();
        Info info4 = new Info();
        info4.setId(1);
        info4.setCount2(new BigDecimal(100));
        Info info5 = new Info();
        info5.setId(2);
        info5.setCount2(new BigDecimal(200));
        Info info6 = new Info();
        info6.setId(4);
        info6.setCount2(new BigDecimal(400));
        list2.add(info4);
        list2.add(info5);
        list2.add(info6);
        //缓存不同部分
        List<Info> dif=new ArrayList<>();
        //是否存在的标志
        boolean exist;
        for (Info to : list1) {
            exist=false;
            //以list2为标准进行判重
            for (Info from : list2) {
                if (Objects.equals(to.getId(), from.getId())){
                    if (from.getCount1()==null){
                        from.setCount1(to.getCount1());
                    }
                    if (from.getCount2()==null){
                        from.setCount2(to.getCount2());
                    }
                    exist=true;
                }
            }
            if (!exist){
                dif.add(to);
            }
        }
        //合并不同部分
        list2.addAll(dif);
        System.out.println(list2);
    }
}