通过从列表中删除一个对象(具有重复对象的不同对象)来创建新的非重复列表

Muneer:

如果该列表包含具有相同元素的唯一对象,如何从列表中删除对象?

static class UserDTO {

        private String name;
        private String email;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

    }

        UserDTO u1 = new UserDTO();
        u1.setEmail("[email protected]");
        u1.setName("one");

        UserDTO u2 = new UserDTO();
        u2.setEmail("[email protected]");
        u2.setName("two");

        UserDTO u3 = new UserDTO();
        u3.setEmail("[email protected]");
        u3.setName("three");

        UserDTO u4 = new UserDTO();
        u4.setEmail("[email protected]");
        u4.setName("four");


        UserDTO u5 = new UserDTO();
        u5.setEmail("[email protected]");
        u5.setName("five");

        List<UserDTO> users = new ArrayList<>(); 
        users.add(u1);
        users.add(u2);
        users.add(u3);
        users.add(u4);
        users.add(u5);

现在如何将用户列表排序或过滤到仅包含u1,u2,u4,u5的新列表,因为u2,u3具有相同的电子邮件。

我尝试使用所有这些选项1)

List<UserDTO> newUsersList =    uers.stream().distinct().collect(Collectors.toList());

2)

List<UserDTO> newUsersList =  users.stream().filter(o-> ! o.getEmail().equalsIgnoreCase(users.parallelStream().findAny().get().getEmail())).collect(Collectors.toList());

3)

 List<UserDTO> newUsersList =  users2.stream().filter(o-> users2.stream().map(UserDTO::getEmail).anyMatch(p -> !p.equalsIgnoreCase(o.getEmail()))).collect(Collectors.toList());

4)

Set<UserDTO> newUsersList = users2.stream().filter(o-> users2.stream().map(UserDTO::getEmail).anyMatch(p -> !p.equalsIgnoreCase(o.getEmail()))).collect(Collectors.toSet());

我想要

List<UserDTO> newUsersList = new ArrayList<>(); 

for(UserDTO u :newUsersList ) {
    System.out.println(u.getName() + "  "+u.getEmail());
}

印刷

one  [email protected]
two  [email protected]
four  [email protected]
five  [email protected]
马尔特·哈特维格(Malte Hartwig):

如果您可以覆盖hashCodeequals,请按照Ravindra Ranwala的说明进行操作,并使用Set

    Collection<UserDTO> unique = new HashSet<>(users);

如果您无法覆盖它们,则可以使用TreeSet并为其提供一个自定义Comparator

    Collection<UserDTO> unique = new TreeSet<>(Comparator.comparing(UserDTO::getEmail));
    unique.addAll(users);

尽管非常简单,但是这些方法的缺点是失去了元素的顺序。如果这很重要,请尝试从List“手动”中删除重复项

    Collection<String> uniqueEmails = new HashSet<>();
    users.removeIf(user -> !uniqueEmails.add(user.getEmail()));

您也可以在以下filter阶段中使用此方法Stream

    users.stream()
         .filter(user -> uniqueEmails.add(user.getEmail()))
         ...

如您所见,使用这种方法或Eran的答案,基于纯流的解决方案并不简单。他们必须依靠外部状态或创建临时集合/映射来实现过滤。实现hashCode/ 时,它变得简单得多equals

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从另一个对象列表中删除重复列表对象值

如何创建使用具有使用Java流性质不同的对象列表中不同对象的列表

比较两个列表并从一个列表中删除重复列表

通过合并具有相同ID的集合中的两个对象来创建一个新对象,并将结果对象添加到另一个集合中

创建一个函数,该函数接受具有相同方法的两个不同对象

如何从Kotlin的列表中删除具有distinctBy的重复对象?

从对象列表中删除重复项

通过与现有列表相乘来创建一个新列表对象是否等同于进行深度复制?

创建不同对象的列表副本

如何从对象列表中删除(通过linq)重复项

比较2个具有不同对象的列表Java返回不匹配的列表

Java。如何从两个列表中删除重复的对象

根据属性从列表中删除重复的对象

如何将值从一个列表复制到另一个具有不同对象的列表

如何从对象列表中删除重复项

从列表中删除与其他对象重复的对象(具有相同的变量)

删除条件为Java的重复列表对象

对具有不同对象的数组列表进行排序

从Java列表中删除重复的对象

如何从json创建具有不同对象类型的列表

通过从现有对象中获取一些元素来创建一个新对象

如何从列表中删除重复的字典对象

删除所有具有重复属性/值但最后一个的对象

C#采用两个不同对象的列表来构造新的对象列表

遍历对象数组以根据其属性创建一个没有重复的新对象

如何将具有唯一字段的两个不同对象列表合并到一个单独的列表中?

如果对象具有重复属性,则从列表中删除对象

通过在 Scheme 中重复列表的元素来组成一个列表

添加 2 个对象列表并从最终列表中删除重复的(除了一个字段不同)元素