java - 检查第二个列表中是否缺少第一个列表的任何条目

标签 java lambda java-8 java-stream

我有两个 String 对象列表。第一个列表可以有一个可以根据某些分隔符分割的对象。我想获取第一个列表中第二个列表中不存在的所有记录。

List<String> list = Arrays.asList("A;H","B","C","D");
List collection = Arrays.asList("AH","B","D","E","F");
List<String> result = list.stream().filter(str -> !collection.contains(str)).collect(Collectors.toList());

根据我的要求,上面的代码部分正确。它输出[A;H,C]。我的要求是它应该只给出 C 的输出。因为如果“A;H”的任何字符或 String 对象出现在第二个列表中。不应收集它。

最佳答案

您可以使用正则表达式消除分隔字符,然后比较值是否存在。这是它的样子。

private static final Pattern DELIMITER = Pattern.compile("\\W");

Set<String> set = new HashSet<>(collection);

List<String> nonExistingValues = list.stream()
    .map(s -> DELIMITER.splitAsStream(s).collect(Collectors.joining()))
    .filter(s -> !set.contains(s))
    .collect(Collectors.toList());

重用下面评论中提到的模式的更紧凑的方法是,

List<String> nonExistingValues = list.stream()
    .map(s -> DELIMITER.matcher(s).replaceAll(""))
    .filter(s -> !set.contains(s))
    .collect(Collectors.toList());

关于java - 检查第二个列表中是否缺少第一个列表的任何条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57706517/

相关文章:

java - 在UserGroupInformation中,Zookeeper登录类无法使用reloginfromkeytab方法

java - 如何将 java 对象列表转换为 Map<String, Map<String, String>>

java - 我希望在 android 期间一遍又一遍地检查它,直到它在 android 上等于

c# - 在 C# 中,有没有一种方法可以使用反射仅检索内置数据类型属性

c++ - C++11 中的递归 lambda 实现

lambda - 使用Lambda重构Kotlin方法

java - Lambda 表达式将对象从一个列表添加到另一种类型的列表

java - 使用 lambda for 机制在 Selenium 中查找元素

java - 在 url 中插入双引号时,索引处的查询中存在非法字符

java - 添加 GeoFence jar 库后 GeoServe 崩溃