两个list集合合并为一个集合的问题,望大佬给出个更优方案

两个list集合合并为一个集合的问题

项目中有个需求需要实现两个list集合合并为一个list,两个集合中泛型一样。就如两个集合里面对象数据有公共部分,也有不同部分,现在要做的就是将两个对象中如果公共部分相同的合并在一起而且将对象1中有的而对象2中没有的,对象2中有的,而对象1中没有的合在一起,简单说就是将两个对象非null的数据合在一起。
下面就是我的方案的小demo:
实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String userName;
    private String userAddr;
}

demo:

public static void main(String[] args) {
        List<User> list1 = new ArrayList<>();
        list1.add(new User(1, "张三", null));
        list1.add(new User(2, "李四", "贵州"));
        List<User> list2 = new ArrayList<>();
        list2.add(new User(3, "王五", "荷兰"));
        list2.add(new User(1, null, "四川"));
        List<User> list3 = new ArrayList<>(Stream.of(list1, list2)
                .flatMap(Collection::stream)
                .collect(Collectors.toMap(User::getId, a -> a, (a, b) -> {
                    User c = new User();
                    BeanUtil.copyProperties(a, c, CopyOptions.create().setIgnoreNullValue(true));
                    BeanUtil.copyProperties(b, c, CopyOptions.create().setIgnoreNullValue(true));
                    return c;
                })).values());
        System.out.println(list3);
    }

输出:

[User(id=1, userName=张三, userAddr=四川), 
User(id=2, userName=李四, userAddr=贵州), 
User(id=3, userName=王五, userAddr=荷兰)]

上面代码是满足要求的:可以看最后输出,id是公共部分,我的list1中list1.add(new User(1, "张三", null)); 与list2 中list2.add(new User(1, null, "四川"));可以看出两个user对象一个有name,一个有userAddr,公共id都为1,那么将他们合并就是User(id=1, userName=张三, userAddr=四川)
思路:
我的思路就是既然有相同的地方那么就用map对象key不可以重复的特性,将相同的字段设为key,然后处理key重复的部分数据,然后就是怎么将两个list变成一个map,刚好用到Java 8 API添加的一个新的抽象流Stream 用了Stream.of()方法将两个list合并为一个顺序流 然后用flatMap() 扁平化处理然后再用collect()将他收集为一个maptoMap() 其他文章有说他怎么去自定义处理key重复,这里不重复说了,我是怎么处理重复的了,我重新new了一个user对象c 然后分别capy重复对象a,b,这里忽略copynull的数据,不然达不到效果,最后返回对象c,最后通过values()获取mapvalue集合放入list3
这就是我的解决办法,但是我觉得我的几次copy影响效率了,我知识有限也想不出更优的方案了,希望广大网友和大佬能够给出更棒的思路,然后修正一下。^▽^

今天又到这了,有错麻烦指出,及时改正,有更好的方案麻烦评论回复或者私信,我去及时应用体验,嘿嘿,一起努力,加油!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值