我有一个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表达式实现这一目标?
答案 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
。