使用lambda表达式删除具有重复属性的元素

时间:2018-03-15 01:21:13

标签: java lambda java-8

我有一个Person对象列表,如下所示:

list.add(new Person("John", 20)); //person is just name and age
list.add(new Person("Maria", 21));
list.add(new Person("John", 40));
list.add(new Person("Carl", 10));

结果列表必须没有相同名称的人,无论年龄大小,因此只有3个元素可以存活。如何使用Java 8 lambda表达式实现这一目标?

4 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

Set<String> unique = new HashSet<>();
list.removeIf(e -> !unique.add(e.getName()));

请注意,Person类需要有一个getter来返回该人的姓名。

答案 1 :(得分:0)

覆盖hashCode()equals()。然后你可以使用它:

List<Person> collect = list.stream().distinct().collect(Collectors.toList());

答案 2 :(得分:0)

将列表转换为一个映射,其中键是Person :: getName,值是对象本身,如果它们相等则选择第一个,然后获取作为Collection的映射值,最后转换为列表

list = list.stream().collect(Collectors.toMap(Person:getName, Function.Identity(), 
(a, b) -> a)).values().stream().collect(Collections.toList());

答案 3 :(得分:0)

这可以使用Comparator轻松完成。因为它非常灵活,并且根据您的需要允许多种比较标准。请参阅以下代码: -

    Set<Person> expectedOutput = new TreeSet<>((person1, person2) ->
            person1.getName().equals(person2.getName()) ? 0 : 1
    );
    list.listIterator().forEachRemaining(expectedOutput::add);

我个人会因为波动的标准而避免压倒平等。例如,如果我说我的对象相等,如果在一个场景中名称相等,而在其他场景中,我说如果年龄相等,我的对象是相等的。然后,最好使用comparator