![](/img/trans.png)
[英]segregate duplicates and non duplicates from a list of objects based on property on multiple property in java 8
[英]Removing duplicates from the list of objects based on more than one property in java 8
我試圖從基於兩個屬性的對象列表中刪除重復項,這個問題類似於下面的鏈接,但是我試圖使用Java 8功能基於兩個屬性找到唯一性。
示例:我有一個自定義對象,其中兩個屬性一起構成唯一的條目
說列出客戶
customerName和DOB一起進行唯一輸入。
使用兩個屬性的謂詞來識別區別的任何解決方案。 像下面的鏈接,他們對一個屬性有解決方案。 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())));
Customer
對象中的equals()
和hashCode()
方法,並包括相關字段。 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.