我试图根据两个属性从对象列表中删除重复项,这个问题类似于下面的链接,但我试图根据使用java 8功能的两个属性找到唯一性。
示例:我有自定义对象,其中两个属性一起创建唯一条目
说列出客户
customerName和DOB一起进行唯一输入。
使用谓词对两个属性进行区分的任何解决方案。 如下面链接他们有一个属性的解决方案。 Java 8 Distinct by property
类似的问题:
Remove duplicates from a list of objects based on property in Java 8
答案 0 :(得分:7)
This answer已经指向一个有效的解决方案,因为您可以轻松地使用包含所有属性值的List
作为键,例如。
HashSet<Object> seen=new HashSet<>();
customers.removeIf(c -> !seen.add(Arrays.asList(c.getName(), c.getDayOfBirth())));
如果这些属性永远不是null
,您可以使用Java 9的List.of
代替Arrays.asList
,这可能更有效。
如果您希望Stream解决方案创建新的List
,则可以使用
List<Customer> distinctCustomers = customers.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(c -> Arrays.asList(c.getName(), c.getDayOfBirth()),
Function.identity(), (a,b) -> a, LinkedHashMap::new),
m -> new ArrayList<>(m.values())));
答案 1 :(得分:0)
equals()
对象中的hashCode()
和Customer
方法,并包含相关字段。java.util.Set
代替java.util.List
,只需将对象添加到Set。这将确保您在Set中没有任何重复的对象。 有关详细信息,请参阅此post。
<强>更新强>
覆盖equals()
后,您可以执行以下操作:
List<Customer> distinctCustomers = customersList.stream().distinct().collect(Collectors.toList());
distinct()文档:
java.util.stream.Stream
public abstract Stream distinct()
返回由此流的不同元素(根据Object.equals(Object))组成的流。
答案 2 :(得分:0)
非常简单的解决方案是为您的Class实现一个Comparator接口,该接口将根据您感兴趣的属性比较您的类。然后使用Comparator比较实例是否相等。