使用 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());
正如评论中指出的那样,正确的(如“更具可读性”、“更惯用”和“更少 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());
我有两个带有 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());
正如评论中指出的那样,正确的(如“更具可读性”、“更惯用”和“更少 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());