Java 8中如何找出列表中的所有元素是否都在集合中?

10

虽然使用for循环很容易实现,但在Java 8中是否有一种方式可以查找列表L中的所有元素是否都存在于集合s中?


1
boolean result = s.equals(new HashSet(L)); 布尔结果 = s.equals(new HashSet(L)); - nandal
3个回答

14

使用 Set#containsAll 就可以了,不需要使用 Stream

var set = Set.of(1, 2, 3, 4, 5);
var list = List.of(2, 3, 4);

System.out.println(set.containsAll(list));

输出:

true

1
仅仅因为你可以使用 Set#containsAll 方法并不意味着没有必要使用流(Stream)... - Ousmane D.
@Aominè 我认为在这种情况下,流式处理只会增加开销。如果需要先执行其他操作,比如过滤、映射等,那么这样做是完全可以的。 - Jacob G.
只有在注意到性能问题时才需要担心“开销”。 - Ousmane D.
8
@Aominè:set.containsAll(list)l.stream().allMatch(s::contains)更简洁,语法也更简单,并且在过去的二十年中一直可靠。那么,既然在这里使用流没有性能优势,改变的原因是什么呢? - Holger
@Holger,那不是我的观点。句子“当您可以使用Set#containsAll时,没有必要使用Stream来完成此操作”让我感到不舒服。这就好像在说,不要使用l.stream().filter(...).map(...)..,因为你可以使用for循环来做同样的事情。 - Ousmane D.
我认为在这种情况下,OP可能需要进行映射-归约的遥远可能性并不足以证明使用“Stream”。 - Jacob G.

8
您可以使用allMatch
boolean result = l.stream().allMatch(s::contains);

0

是的。

long commonElements = l.stream().filter(s::contains).count();
if (commonElements == l.size()) {
    //do something
}

集合非常好,因为它们专门用于检查项目是否已存在。列表在这方面不如集合,但对于快速遍历很有用。因此,您需要循环遍历列表并将每个元素与集合进行比较,而不是反过来。

流是执行操作的好资源,而不是明确地打破事物。

编辑:@Aomine的答案比我的更好。

boolean result = myList.stream().allMatch(mySet::contains);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接