使用Stream比较两个集合 - anyMatch

时间:2016-04-16 22:34:01

标签: java java-stream

我想比较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。怎么样?

3 个答案:

答案 0 :(得分:8)

根据您的评论,您有两个列表list1list2。您想知道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)

  • 使用Java 8 stream api
CompletableFuture
  • 使用Collection类方法
boolean isAnyMatch = list2.stream().anyMatch(list1::contains);

无论如何,在比较之前将列表转换为设置将提供更快的输出。