基于java 8中的多个属性从对象列表中删除重复项

时间:2018-02-01 13:00:36

标签: java java-8

我试图根据两个属性从对象列表中删除重复项,这个问题类似于下面的链接,但我试图根据使用java 8功能的两个属性找到唯一性。

示例:我有自定义对象,其中两个属性一起创建唯一条目

说列出客户

customerName和DOB一起进行唯一输入。

使用谓词对两个属性进行区分的任何解决方案。 如下面链接他们有一个属性的解决方案。 Java 8 Distinct by property

类似的问题:

Remove duplicates from a list of objects based on property in Java 8

3 个答案:

答案 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)

  1. 覆盖equals()对象中的hashCode()Customer方法,并包含相关字段。
  2. 使用java.util.Set代替java.util.List,只需将对象添加到Set。
  3. 这将确保您在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比较实例是否相等。