Map.containsValue () возвращает false - PullRequest
1 голос
/ 12 апреля 2019

У меня есть карта, как показано ниже:

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

Возвращает:

{myobj43c0e17f0100000606@3508cfdf=[Immutable]}

Я пытаюсь проверить, содержит ли значение карты строку «Неизменный», тогда япытаясь сделать дальнейшую логику.Но existingNames.containsValue("Immutable") бросков false:

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

Это из-за Set<String>?Если так, то как это проверить?Я думаю, что я делаю что-то не так при сравнении.У меня есть только базовые знания Java, и я не уверен, как преобразовать набор для проверки строки.

Ответы [ 3 ]

4 голосов
/ 12 апреля 2019

Простой способ проверить, содержит ли любой набор значение

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

Если вы хотите проверить, является ли набор singleton содержит строку, затем вы можете создать встроенный набор:

existingNames.containsValue(Collections.singleton("Immutable"))
3 голосов
/ 12 апреля 2019

вам нужно проверить для каждого набора, содержит ли он значение. Вы можете найти его в наборе документов 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*/ }
}
2 голосов
/ 12 апреля 2019

Как уже говорилось, вы сравниваете значение карты с String, однако определение карты равно Map<myobj, Set<String>>, поэтому прямое сравнение со значением Set<String> не будет работать так, как вы.

Вот способ, совместимый с с использованием , ключевой метод - Stream::anyMatch, который возвращает true независимо от того, есть ли элементы поток соответствует предоставленному предикату.

Чтобы найти элемент в Set, используйте Set::contains:

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