根据Java 8中的多个属性从对象列表中删除重复项

Pav*_* ks 0 java java-8

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

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

说列出客户

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

使用两个属性的谓词来识别区别的任何解决方案。像下面的链接,他们对一个属性有解决方案。 Java 8按属性区分

类似的问题:

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

Hol*_*ger 8

链接问题的这个答案已经指向了一个可行的解决方案,因为您可以轻松地使用List包含所有属性值作为键,例如

HashSet<Object> seen=new HashSet<>();
customers.removeIf(c -> !seen.add(Arrays.asList(c.getName(), c.getDayOfBirth())));
Run Code Online (Sandbox Code Playgroud)

如果这些属性从不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())));
Run Code Online (Sandbox Code Playgroud)