2 回答
TA贡献1827条经验 获得超8个赞
如果您可以覆盖hashCodeand equals,请按照 Ravindra Ranwala 的说明操作并使用Set:
Collection<UserDTO> unique = new HashSet<>(users);
如果您无法覆盖它们,您可以使用TreeSet并为其提供自定义Comparator:
Collection<UserDTO> unique = new TreeSet<>(Comparator.comparing(UserDTO::getEmail));
unique.addAll(users);
虽然非常简单,但这些方法的缺点是会丢失元素的顺序。如果这很重要,请尝试从List“手动”中删除重复项:
Collection<String> uniqueEmails = new HashSet<>();
users.removeIf(user -> !uniqueEmails.add(user.getEmail()));
您还可以将此方法用于 a 中的filter阶段Stream:
users.stream()
.filter(user -> uniqueEmails.add(user.getEmail()))
...
正如您通过这种方法或 Eran 的回答所看到的,纯基于流的解决方案并不简单。他们要么依赖外部状态,要么创建临时集合/映射来实现过滤。实现hashCode/时它变得简单得多equals。
TA贡献1797条经验 获得超6个赞
您可以使用电子邮件地址collectors.groupingBy对UserDTO实例进行分组,然后获取每个组的第一个实例:
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())如果实现尝试只会工作equals的UserDTO类只比较电子邮件地址(这是指含相同的电子邮件两种情况将被视为相等)。
添加回答
举报