从列表中删除对象 - 包含字符串 - 比较列表

Remove objects from list - contains strings - Comparing the List

我的问题是 - 如何通过将对象与第二个列表进行比较来从列表中删除对象。

List1 - 第一个列表包含 电子邮件地址
List2 - 第二个列表包含仅域,格式为“@domain.com”等

我想从第一个列表中删除包含第二个列表中的域的对象(电子邮件)。

例如:
如果 List1 包含电子邮件地址:"email@domain.com" 并且第二个 List2 包含“@domain.com” - 那么我想删除此电子邮件(来自 List1)

我尝试使用:

List1.removeIf(s -> s.equals (List2));
List1.removeAll(List2);

不幸的是,它没有按照我的意愿过滤我的列表。

我将感谢你的快速帮助

您可以创建要从第一个列表中删除的对象的新列表,然后删除它们:

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);
}

类似于

list1.removeIf(email -> list2.stream().anyMatch(email::endsWith));

应该可以

首先,使用您的域创建一个 HashSet

Set<String> domains = new HashSet<>(list2);

现在,在第一个列表中使用 removeIf

list1.removeIf(email -> domains.contains("@" + email.split("@")[1]));

使用Set(而不是原来的list2)的想法是优化搜索,即contains 运行 in O(1) 摊销时间。

注意: 我假设 list2 中的所有域都以 "@".

开头