如何在HashMap中查找关于该元素的给定条件为真的任何元素

时间:2017-12-05 16:43:18

标签: 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;
    }
}

这个问题是它没有提前终止,在这个lambda中可以使用breakreturn来提前终止循环。

我看到了流的anyMatch()函数:

 map.entrySet().stream().anymatch(....

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

2 个答案:

答案 0 :(得分:1)

解决这个问题的一种方法是使用url-pattern方法。

例如,在您的情况下,您可以编写如下内容:

findFirst

答案 1 :(得分:1)

以前海报的工作答案(有没有办法告诉哪个更有效?)

 //Note: anyMatch can be switched with noneMatch if need be

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

if (map.values().stream().anyMatch(v -> v.message.equalsIgnoreCase(searchValue))
    {...}

@Louis Wasserman:

if (map.values().stream().map(v -> v.message).anyMatch(searchValue::equalsIgnoreCase)) 
   {...}

@ P3trur0:

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