我有两个清单
List<String> names1;
List<String> names2;
Run Code Online (Sandbox Code Playgroud)
我想要一个新列表返回给我,其中包含两个列表中都存在的值。这些值不应像retainAll 那样重复。
这是我原来的方法:
return ListUtils.intersection(names1, names2);
Run Code Online (Sandbox Code Playgroud)
它工作正常。但它区分大小写,因此 AbC 与 abc 不同。我需要比较不区分大小写。有没有另一种方法可以做到这一点?
将一个列表的内容放入 a 中Set<String>,小写,例如:
Set<String> lcNames2 =
names2.stream().map(String::toLowerCase).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
然后:
List<String> intersection =
names2.stream()
.filter(n -> lcNames2.contains(n.toLowerCase())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但请注意,当您不将相等作为等价关系来处理时,交集的概念是相当不明确的。
Lists.intersection有效地将两个列表视为集合,因为它不会两次添加相同的元素。
但是,如果您不处理 equals,那么“不要两次添加相同的元素”是什么意思?
或者是其他东西。
具体的解决方案取决于您的实际需求。