【问题标题】:For loop for keys of map using streams使用流的地图键的for循环
【发布时间】:2021-03-01 10:00:47
【问题描述】:

我想检查地图的任何键是否包含在其他集合中,并在找到匹配项后立即返回 true。一般的做法是这样的

for each element in the set:
 for each key of the map:
  if current element of set == current key of map
   return true

我想通过使用 Java 中的流来做到这一点。所以我相信将 map 的键转换为流的方法是通过

myMap.entries().stream().map(Map.Entry::getKey)

然后在每一个上运行一个 for 循环就是我正在寻找的。​​p>

我认为的另一种方式是如下所示

myMap.keySet().forEach((k) -> set.contains(k));

但我希望外部循环属于集合,因为集合的元素比地图少得多。

【问题讨论】:

    标签: java java-8 stream java-stream


    【解决方案1】:

    你可以写任何一个

    return myMap.keySet().stream().anyMatch(set::contains);
    

    return set.stream().anyMatch(myMap::containsKey);
    

    如果Set 小于Map,后者应该更有效,因为set::containsmyMap::containsKey 都应该花费预期的恒定时间(假设HashMap/HashSet 实现)。

    【讨论】:

    • 心不在焉,无法问出复杂性问题,感谢您指出这一点。
    • @SonaliGupta 实际上我改变了关于复杂性的部分。在 Set 上流式传输应该更有效。
    • 如上所述。对于第二个选项将 set.stream().anyMatch(myMap.entrySet());相同,因为如果返回布尔值相同,我发现它更易于阅读。
    • @SonaliGupta 你不能将myMap.entrySet() 传递给anyMatch,因为它不是谓词。你必须通过x -> myMap.entrySet().contains(x)
    • 是的,它不能编译。我想了解这是否意味着整个条目集中的 anyMatch。但我认为这意味着集合中的任何元素都匹配地图的任何键。很清楚。将进一步深入阅读。感谢您回答问题。
    【解决方案2】:
    Map<K, V> map = ...;
    Set<K> keySet = ...;
    
    boolean exists = map.keySet().stream().anyMatch(keySet::contains);
    

    更多详情请见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多