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

标签 java java-8

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

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

说列出客户

客户姓名和出生日期一起构成唯一的条目。

使用两个属性的谓词来识别区别的任何解决方案。 就像下面的链接一样,他们对一处特性有解决方案。 Java 8 Distinct by property

类似问题:

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

最佳答案

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())));

关于java - java 8中基于多个属性从对象列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48563377/

相关文章:

java - 使用 Streams 替换 For-Each 循环

Java8 - 映射流而不收集性能

java - 正则表达式替换为 Stream

java - 访问存储在 Arraylist 中的 Arraylist 中的数据 - Java

java - 未配置嵌入式 jetty web 服务器 JSP 支持

java - 使用 Java 8 DateTimeFormatter 解析 ZonedDateTime

java-8 - 用于比较谓词的链式 java.util.function.Predicate 调用

java - jaxb2-maven-plugin :schemagen to work with JDK8? 是否有修复

MySQL 中的 Java 空指针异常

java - 如何在 JFrame 中使单个 JPanel 变大