我想比较list2
中是否存在list1
中的任何对象。
我可以迭代两个列表并使用.contains()
比较所有元素,但我想知道是否没有更有效的方法。我找到了this,我正在尝试实施建议的方法:
List<Item> list1;
List<Item> list2;
boolean anyMatch = list1.stream().anyMatch(x -> x.equals(list2.stream()));
System.out.println(anyMatch);
当我这样做时,我会不断得到false
,即使我期待true
。怎么样?
答案 0 :(得分:8)
根据您的评论,您有两个列表list1
和list2
。您想知道list2
中是否包含list1
中至少有一个元素。
使用Stream API,您可以获得Stream
list2
。然后,调用anyMatch(predicate)
返回此流的一个元素是否与给定谓词匹配,在这种情况下,测试该元素是否包含在list1
中。
boolean anyMatch = list2.stream().anyMatch(list1::contains);
这使用method reference作为谓词。
通过将list1
转换为Set
,您可以获得更好的效果,从而确保实时查找:
boolean anyMatch = list2.stream().anyMatch(new HashSet<>(list1)::contains);
答案 1 :(得分:7)
虽然@Tunaki's answer是正确的,但这是另一种更简洁的方法(它不会使用Stream.anyMatch()
方法):
boolean anyMatch = !Collections.disjoint(list1, list2);
这使用Collections.disjoint()
方法,当两个集合没有共同的元素时返回true
。
Tunaki关于效果的评论也适用于此:为了获得更好的效果,最好将list1
变为HashSet
,因为其contains()
方法为{{ 1}}平均。 O(1)
方法实际检查其任何参数是否为Collections.disjoint()
并迭代不是Set
的集合。因此,在您的情况下,您所要做的就是从Set
创建HashSet
:
list1
注意:毕竟,我的回答只比Tunaki的简短5个字符:)
答案 2 :(得分:1)
CompletableFuture
boolean isAnyMatch = list2.stream().anyMatch(list1::contains);
无论如何,在比较之前将列表转换为设置将提供更快的输出。