如何在 HashMap 中查找给定条件为 true 的任何元素

Cee*_*lus 5 java loops hashmap

  • 给定一个对象,MyObj出于我们的目的,该对象包含String message在其他字段中。
  • 给定一个 HashMap Map <MultiKey<String>,MyObj> map,.

我想循环遍历 HashMap 查找 MyObj 消息所在的任何元素searchValue。我本质上是想在地图上使用stream().anyMatch(),我只是想知道是否searchValue存在,即使在任何地方一次 - 即短路是更好的选择。

Foreach 循环:

map.forEach((k,v) -> {
    if (v.message.equalsIgnoreCase(searchValue)) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是它不会提前终止,breakreturn不能在此 lambda 中使用来提前终止循环。

我看到流 anyMatch() 函数:

 map.entrySet().stream().anymatch(....
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚正确的语法 - 如果这在这种情况下完全有效(如果我不比较地图的元素,而是比较每个元素的字段,它仍然可以使用)。

Cee*_*lus 4

之前海报的工作答案(有没有办法判断哪个更有效?)

 //Note: anyMatch can be switched with noneMatch if need be
Run Code Online (Sandbox Code Playgroud)

@JimGarrison:(似乎是最短/可读的):

if (map.values().stream().anyMatch(v -> v.message.equalsIgnoreCase(searchValue))
    {...}
Run Code Online (Sandbox Code Playgroud)

@路易斯·沃瑟曼:

if (map.values().stream().map(v -> v.message).anyMatch(searchValue::equalsIgnoreCase)) 
   {...}
Run Code Online (Sandbox Code Playgroud)

@P3trur0:

if (null != map.values().stream().filter(v -> v.message.equalsIgnoreCase(searchValue)).findAny().orElse(null))
    {...}
Run Code Online (Sandbox Code Playgroud)

  • `stream.filter(condition).find{Any|First}().orElse(null) != null` 永远不会比 `stream.anyMatch(condition)` 更好 (2认同)