MyObj
,其中包含String message
以及其他字段。Map <MultiKey<String>,MyObj> map
。我想遍历HashMap,找到MyObj消息为searchValue
的任何元素。我本质上是想在地图上使用stream().anyMatch()
,我只是想知道searchValue
是否存在于任何地方 - 即短路是可取的。
Foreach循环:
map.forEach((k,v) -> {
if (v.message.equalsIgnoreCase(searchValue)) {
return true;
}
}
这个问题是它没有提前终止,在这个lambda中可以使用break
或return
来提前终止循环。
我看到了流的anyMatch()函数:
map.entrySet().stream().anymatch(....
但我无法弄清楚正确的语法 - 如果在这种情况下它会起作用(如果我不比较地图的元素,它仍然可以使用,而不是我在比较每个元素的字段)。 / p>
答案 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))
{...}