2 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您可以覆蓋hashCodeand equals,請(qǐng)按照 Ravindra Ranwala 的說(shuō)明操作并使用Set:
Collection<UserDTO> unique = new HashSet<>(users);
如果您無(wú)法覆蓋它們,您可以使用TreeSet并為其提供自定義Comparator:
Collection<UserDTO> unique = new TreeSet<>(Comparator.comparing(UserDTO::getEmail));
unique.addAll(users);
雖然非常簡(jiǎn)單,但這些方法的缺點(diǎn)是會(huì)丟失元素的順序。如果這很重要,請(qǐng)嘗試從List“手動(dòng)”中刪除重復(fù)項(xiàng):
Collection<String> uniqueEmails = new HashSet<>();
users.removeIf(user -> !uniqueEmails.add(user.getEmail()));
您還可以將此方法用于 a 中的filter階段Stream:
users.stream()
.filter(user -> uniqueEmails.add(user.getEmail()))
...
正如您通過(guò)這種方法或 Eran 的回答所看到的,純基于流的解決方案并不簡(jiǎn)單。他們要么依賴外部狀態(tài),要么創(chuàng)建臨時(shí)集合/映射來(lái)實(shí)現(xiàn)過(guò)濾。實(shí)現(xiàn)hashCode/時(shí)它變得簡(jiǎn)單得多equals。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以使用電子郵件地址collectors.groupingBy對(duì)UserDTO實(shí)例進(jìn)行分組,然后獲取每個(gè)組的第一個(gè)實(shí)例:
List<UserDTO> newUsersList =
users.stream() // Stream<UserDTO>
.collect(Collectors.groupingBy(UserDTO::getEmail)) // Map<String,List<UserDTO>>
.values() // Collection<List<UserDTO>>
.stream() // Stream<List<UserDTO>>
.map(list -> list.get(0)) // Stream<UserDTO>
.collect(Collectors.toList()); // List<UserDTO> that has one instance for each
// unique email
該users.stream().distinct().collect(Collectors.toList())如果實(shí)現(xiàn)嘗試只會(huì)工作equals的UserDTO類只比較電子郵件地址(這是指含相同的電子郵件兩種情況將被視為相等)。
添加回答
舉報(bào)