Map.containsValue() 返回错误

Map.containsValue() returning false

我有一张地图如下:

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

它returns:

{myobj43c0e17f0100000606@3508cfdf=[Immutable]}

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

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

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

您需要检查每个集合是否包含该值。您可以在 Set java 文档中找到它: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*/ }
}

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

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

如果你想检查集合是否是包含字符串的单例,那么你可以创建一个内联集合:

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

前面已经说过,你将map的值与String进行比较,但是map的定义是Map<myobj, Set<String>>,因此直接与值Set<String>进行比较不会按照您的方式工作。

这里是 compliant way using , the key method is Stream::anyMatch 其中 returns true 流的任何元素是否匹配提供的谓词。

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

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