我的问题是-如何通过与第二个列表进行比较从列表中删除对象。
列表1-第一个列表包含电子邮件地址。
List2-第二个列表包含仅域,格式为“ @ domain.com ”等
我想从第一个列表中删除包含第二个列表中的域的对象(电子邮件)。
例如:
如果List1包含电子邮件地址:“ email@domain.com”,第二个List2包含“ @ domain.com”,那么我想删除此电子邮件(从List1)
我尝试使用:
List1.removeIf(s -> s.equals (List2));
List1.removeAll(List2);
不幸的是,它没有按照我的意愿过滤列表。
感谢您的快速帮助
答案 0 :(得分:5)
类似
list1.removeIf(email -> list2.stream().anyMatch(email::endsWith));
应该工作
答案 1 :(得分:3)
首先,使用您的域创建一个HashSet
:
Set<String> domains = new HashSet<>(list2);
现在,在第一个列表中使用removeIf
:
list1.removeIf(email -> domains.contains("@" + email.split("@")[1]));
使用Set
(而不是原始的list2
)的想法是优化搜索,即使contains
在O(1)
的摊销时间内运行。
注意:我假设list2
中的所有域都以"@"
开头。
答案 2 :(得分:1)
您可以创建要从第一个列表中删除的对象的新列表,然后将其删除:
List<String> objectsToBeRemoved = list1.stream()
.filer(email-> isNotValidEmail(email,list2))
.collect(toList());
list1.removeAll(objectsToBeRemoved);
另一种选择是使用removeIf:
List<String> emails = new ArrayList<>(Arrays.asList("email@domain.com", "email2@domain.com","ssss@ff.com"));
List<String> domains = new ArrayList<>(Arrays.asList("@domain.com"));
emails.removeIf(email -> isNotValidEmail(domains, email));
private boolean isNotValidEmail(List<String> domains, String email) {
return domains.stream()
.anyMatch(email::endsWith);
}