我有一张地图如下:
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的基本知识,不知道如何转换集来检查字符串。
检查任何集合是否包含值的简单方法是
existingNames.values().stream().anyMatch(s -> s.contains("Immutable"))
如果要检查该集是否是包含该字符串的单例,则可以创建内联集:
existingNames.containsValue(Collections.singleton("Immutable"))
你需要检查每个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*/ }
}
如前所述,您将地图的值与String
进行比较,但是,地图的定义是Map<myobj, Set<String>>
,因此与值Set<String>
的直接比较将不会像您那样工作。
这是使用java-8的java-stream兼容方式,关键方法是Stream::anyMatch
,它返回true
,无论流的任何元素是否与提供的谓词匹配。
要在Set
中找到元素,请使用Set::contains
:
existingNames.values().stream().anyMatch(set -> set.contains("Immutable"))