簡體   English   中英

根據Java 8中的多個屬性從對象列表中刪除重復項

[英]Removing duplicates from the list of objects based on more than one property in java 8

我試圖從基於兩個屬性的對象列表中刪除重復項,這個問題類似於下面的鏈接,但是我試圖使用Java 8功能基於兩個屬性找到唯一性。

示例:我有一個自定義對象,其中兩個屬性一起構成唯一的條目

說列出客戶

customerName和DOB一起進行唯一輸入。

使用兩個屬性的謂詞來識別區別的任何解決方案。 像下面的鏈接,他們對一個屬性有解決方案。 Java 8按屬性區分

類似的問題:

根據Java 8中的屬性從對象列表中刪除重復項

鏈接問題的這個答案已經指向了可行的解決方案,因為您可以輕松地使用包含所有屬性值的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. 覆蓋Customer對象中的equals()hashCode()方法,並包括相關字段。
  2. 使用java.util.Set代替java.util.List並將對象添加到Set中。

這將確保您在集合中沒有任何重復的對象。 有關更多信息,請參見此帖子

更新:

覆蓋equals()您可以執行以下操作:

List<Customer> distinctCustomers = customersList.stream().distinct().collect(Collectors.toList());

與眾不同的文檔:

java.util.stream.Stream
公共抽象流different()
返回由該流的不同元素組成的流( 根據Object.equals(Object) )。

一個非常簡單的解決方案是為您的類實現一個Comparator接口,該接口將根據您感興趣的屬性比較您的類。 然后使用比較器比較實例是否相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM