Map.containsValue()返回false

问题描述 投票:1回答:3

我有一张地图如下:

final Map<myobj,Set<String>> existingNames = this.getExistingCIs(_actual,_names.keySet());

它返回:

{myobj43c0e17f0100000606@3508cfdf=[Immutable]}

我正在尝试检查映射值是否包含字符串“Immutable”然后我正在尝试进一步的逻辑。但existingNames.containsValue("Immutable")抛出false

if (existingNames.containsValue("Immutable")) { 
    // mylogic
}

是因为Set<String>?如果是这样如何检查?我觉得比较时我做错了什么。我只掌握Java的基本知识,不知道如何转换集来检查字符串。

java string collections set contains
3个回答
4
投票

检查任何集合是否包含值的简单方法是

existingNames.values().stream().anyMatch(s -> s.contains("Immutable"))

如果要检查该集是否是包含该字符串的单例,则可以创建内联集:

existingNames.containsValue(Collections.singleton("Immutable"))

3
投票

你需要检查每个Set是否包含值。您可以在Set java doc:https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#contains(java.lang.Object)中找到它

你可以这样做:

for (Set<String> names: existingNames.values()) {
  if (names.contains("Immutable")) { /* your logic*/ }
}

2
投票

如前所述,您将地图的值与String进行比较,但是,地图的定义是Map<myobj, Set<String>>,因此与值Set<String>的直接比较将不会像您那样工作。

这是使用兼容方式,关键方法是Stream::anyMatch,它返回true,无论流的任何元素是否与提供的谓词匹配。

要在Set中找到元素,请使用Set::contains

existingNames.values().stream().anyMatch(set -> set.contains("Immutable"))
© www.soinside.com 2019 - 2024. All rights reserved.