如果该列表包含具有相同元素的唯一对象,如何从列表中删除对象?
static class UserDTO {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
UserDTO u1 = new UserDTO();
u1.setEmail("[email protected]");
u1.setName("one");
UserDTO u2 = new UserDTO();
u2.setEmail("[email protected]");
u2.setName("two");
UserDTO u3 = new UserDTO();
u3.setEmail("[email protected]");
u3.setName("three");
UserDTO u4 = new UserDTO();
u4.setEmail("[email protected]");
u4.setName("four");
UserDTO u5 = new UserDTO();
u5.setEmail("[email protected]");
u5.setName("five");
List<UserDTO> users = new ArrayList<>();
users.add(u1);
users.add(u2);
users.add(u3);
users.add(u4);
users.add(u5);
现在如何将用户列表排序或过滤到仅包含u1,u2,u4,u5的新列表,因为u2,u3具有相同的电子邮件。
我尝试使用所有这些选项1)
List<UserDTO> newUsersList = uers.stream().distinct().collect(Collectors.toList());
2)
List<UserDTO> newUsersList = users.stream().filter(o-> ! o.getEmail().equalsIgnoreCase(users.parallelStream().findAny().get().getEmail())).collect(Collectors.toList());
3)
List<UserDTO> newUsersList = users2.stream().filter(o-> users2.stream().map(UserDTO::getEmail).anyMatch(p -> !p.equalsIgnoreCase(o.getEmail()))).collect(Collectors.toList());
4)
Set<UserDTO> newUsersList = users2.stream().filter(o-> users2.stream().map(UserDTO::getEmail).anyMatch(p -> !p.equalsIgnoreCase(o.getEmail()))).collect(Collectors.toSet());
我想要
List<UserDTO> newUsersList = new ArrayList<>();
for(UserDTO u :newUsersList ) {
System.out.println(u.getName() + " "+u.getEmail());
}
印刷
one [email protected]
two [email protected]
four [email protected]
five [email protected]
如果您可以覆盖hashCode
和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()));
您也可以在以下filter
阶段中使用此方法Stream
:
users.stream()
.filter(user -> uniqueEmails.add(user.getEmail()))
...
如您所见,使用这种方法或Eran的答案,基于纯流的解决方案并不简单。他们必须依靠外部状态或创建临时集合/映射来实现过滤。实现hashCode
/ 时,它变得简单得多equals
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句