怎么从一个list中筛选出另一个list中没有的对象

今天突然遇到这样一个需求,有两个用户对象的集合(list1,list2),现在要找出list2中和list1用户名不同的元素合并到list1中,以下是实现方法

list1 = [{"userId": null,"userName": "a"},
	{"userId": null,"userName": "b"}]
list2 = [{"userId": null,"userName": "c"},
	{"userId": null,"userName": "d"},
	{"userId": null,"userName": "a"}]
  1. 双重循环比较

    List<SysUser> list1_ = new ArrayList<>();
    list1_.addAll(list1);
    for (SysUser user2 : list2) {
        int i = 0;
        for (; i < list1_.size(); i++) {
            if (user2.getUserName().equals(list1_.get(i).getUserName())) {
                // 如果存在,跳出内层循环
                break;
            }
        }
        if (i >= list1_.size()) {
            list1.add(user2);
        }
    }
    
  2. 使用Map辅助比较

    /**
     * @param list1
     * @param list2
     * @return
     */
    private static List<SysUser> getDifferent(List<SysUser> list1, List<SysUser> list2) {
        List<SysUser> diff = new ArrayList<>();
        Map<SysUser,Integer> map = new HashMap<>(list2.size());
        // 先将list1中的元素放入map、不同元素的集合
        for (SysUser stu : list1) {
            map.put(stu, 1);
            diff.add(stu);
        }
        for (SysUser stu : list2) {
            // 如果没找到list1中的元素,放入不同元素集合
            if(map.get(stu)==null)
            {
                diff.add(stu);
            }
        }
        return diff;
    }
    
  3. 使用stream

    // 从list2中筛选出list1中没有的元素
    List<SysUser> diff = list2.stream().filter(
            user2 -> !list1.stream().map(user1 -> user1.getUserName()).collect(Collectors.joining()).contains(user2.getUserName()))
            .collect(Collectors.toList());
    list1.addAll(diff);
    

联系方式

作者:永夜

邮箱:Evernight@aliyun.com

以上内容有不正确的地方烦请指正!

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...