使用 Java 函数式编程识别两个列表中不存在的值

Identify values not exist in two List with Java functional programming

我有两个带有 ID 列表的字符串 ArrayList。

列表 list1 -> [“1”、“2”、“3”、“4”、“5”、“6”] 和 清单 list2 -> ["2", "3", "4", "6"]

我要获取ID不重复的列表

列表 list3 -> ["1", "5"]

我用 Java 7:

开发了这个
for (String id : list1) {
   if (!list2.contains(id)) {
     list3.add(id);
   }
 }

我想在 Java 函数式编程中这样做...可以使用流或类似的方法吗?

List<String> differences = listOne.stream()
            .filter(element -> !listTwo.contains(element))
            .collect(Collectors.toList());

来源:https://www.baeldung.com/java-lists-difference

正如评论中指出的那样,正确的(如“更具可读性”、“更惯用”和“更少 error-prone”)的方法是使用 removeAll,如在

list1.removeAll(list2);

请注意,这会修改原始列表。

如果您坚持使用流(或者您只是不想修改原始列表),您可以过滤掉出现在两个列表中的值(即只让来自 list1 的值是 包含在 list2 中通过过滤器)

var list3 = list1.stream()
                 .filter(Predicate.not(list2::contains))
                 .collect(Collectors.toList());

注意:我使用了 Predicate::not,因为您用 java-11 标记了问题。它在 Java 8 中不可用。如果您坚持使用 Java 8(或 9 或 10),过程是相似的,但更冗长

var list3 = list1.stream()
                 .filter(s -> !list2.contains(s))
                 .collect(Collectors.toList());