使用流的地图键循环
For loop for keys of map using streams
我想检查地图的任何键是否包含在其他集合中,并且 return 一旦找到一个匹配项就为真。一般的做法是
for each element in the set:
for each key of the map:
if current element of set == current key of map
return true
我想通过使用 Java 中的流来做到这一点。所以我相信将地图的键转换为流的方法是
myMap.entries().stream().map(Map.Entry::getKey)
然后 运行 每个循环上的 for 循环就是我要找的。
我认为的另一种方式是如下所示
myMap.keySet().forEach((k) -> set.contains(k));
但我希望外循环属于集合,因为集合的元素比映射少得多。
你可以这样写
return myMap.keySet().stream().anyMatch(set::contains);
或
return set.stream().anyMatch(myMap::containsKey);
如果 Set
小于 Map
,后者应该更有效,因为 set::contains
和 myMap::containsKey
都应该花费预期的常数时间(假设 HashMap
/HashSet
实施)。
Map<K, V> map = ...;
Set<K> keySet = ...;
boolean exists = map.keySet().stream().anyMatch(keySet::contains);
有关详细信息,请参阅 here。
我想检查地图的任何键是否包含在其他集合中,并且 return 一旦找到一个匹配项就为真。一般的做法是
for each element in the set:
for each key of the map:
if current element of set == current key of map
return true
我想通过使用 Java 中的流来做到这一点。所以我相信将地图的键转换为流的方法是
myMap.entries().stream().map(Map.Entry::getKey)
然后 运行 每个循环上的 for 循环就是我要找的。
我认为的另一种方式是如下所示
myMap.keySet().forEach((k) -> set.contains(k));
但我希望外循环属于集合,因为集合的元素比映射少得多。
你可以这样写
return myMap.keySet().stream().anyMatch(set::contains);
或
return set.stream().anyMatch(myMap::containsKey);
如果 Set
小于 Map
,后者应该更有效,因为 set::contains
和 myMap::containsKey
都应该花费预期的常数时间(假设 HashMap
/HashSet
实施)。
Map<K, V> map = ...;
Set<K> keySet = ...;
boolean exists = map.keySet().stream().anyMatch(keySet::contains);
有关详细信息,请参阅 here。