如何检查我的arraylist中是否有不在hashmap中的元素?

ran*_*er1 7 java collections java-8 java-stream

我有一个List<String>in java并且它包含一些字符串.

我也有一个hashmapString值,我想检查我的列表中是否有任何不在Hashmap中的元素.这是我写的代码:

List<String> someStrings = fetchData();
if (someStrings.stream().noneMatch(s -> myHashMap.containsValue(s))) {
    return false;
} 
return true;
Run Code Online (Sandbox Code Playgroud)

但它不能正常工作.你能帮帮我吗?

Nam*_*man 12

鉴于你的条件是

如果我的列表中有任何元素不在Hashmap中

您可以anyMatch在迭代元素列表时使用,以检查它们中的任何一个是否不存在于hashmap值中.

return someStrings.stream().anyMatch(val -> !myHashMap.containsValue(val))
Run Code Online (Sandbox Code Playgroud)

或者查看它,好像所有元素someStrings都存在于hashmap值中

return someStrings.stream().allMatch(myHashMap::containsValue);
Run Code Online (Sandbox Code Playgroud)

虽然类似的检查也可以使用containsAll超过Collection值:

return myHashMap.values().containsAll(someStrings);
Run Code Online (Sandbox Code Playgroud)

  • 是的,这些是同一测试的两个方面,你可以相应地使用任何一个结果,但由于OP似乎对"List.of("")`的结果感到困惑,我只是想留下一个关于相反的值,以确保OP在测试时不会忽略那个小细节. (2认同)

Lin*_*ica 7

不需要流,你可以使用好的旧Collection#removeAll():

Set<String> copy = new HashSet<>(someStrings);
copy.removeAll(myHashMap.values());
Run Code Online (Sandbox Code Playgroud)

现在copy将包含未包含的所有值myHashMap.然后你可以用它们做一些事情(比如迭代)或者只是调用Collection#isEmpty()以检查地图中是否包含所有内容