【问题标题】:Map.containsValue() returning falseMap.containsValue() 返回 false
【发布时间】:2019-09-02 22:53:57
【问题描述】:

我有一张地图如下:

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

返回:

{myobj43c0e17f0100000606@3508cfdf=[Immutable]}

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

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

是因为Set&lt;String&gt;吗?如果是这样如何检查?我认为我在比较时做错了。我只有 Java 的基本知识,不知道如何转换集合来检查字符串。

【问题讨论】:

  • existingNames.containsValue("Immutable") 检查 String 作为值。但是您的地图值是 Set&lt;String&gt; 对象。 Set 在概念上不能等于 String,可以吗?
  • 你应该遵循Java命名约定:变量名和方法名用驼峰命名; PascalCase 中的类名。
  • @ernest_k,是的,我同意。但我不知道如何用 mystring 检查set 对象

标签: java string collections set contains


【解决方案1】:

检查any是否设置包含值的简单方法

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

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

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

【讨论】:

    【解决方案2】:

    您需要检查每个 Set 是否包含该值。您可以在 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*/ }
    }
    

    【讨论】:

      【解决方案3】:

      如前所述,您将映射的值与String 进行比较,但是映射的定义是Map&lt;myobj, Set&lt;String&gt;&gt;,因此与值Set&lt;String&gt; 的直接比较不会像您那样工作。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 2015-08-02
        • 2012-05-17
        • 2013-10-26
        • 2013-01-06
        相关资源
        最近更新 更多