Проверьте в карте списка, если существует значение для конкретного ключа Java 8 - PullRequest
0 голосов
/ 06 июня 2018

В Java 7 у меня есть

Map<String, List<String>> m = new HashMap<String, List<String>>();
boolean result = false;
m.put("Name1", Arrays.asList("abc*1"));
m.put("Name2", Arrays.asList("abc@*1"));


for (Map.Entry<String, List<String>> me : m.entrySet()) {
    String key = me.getKey();
    List<String> valueList = me.getValue();
    if (key.equals("Name2"){
        System.out.print("Values: ");
        for (String s : valueList) {
            if(s.contains("@"){
                result = true;
            }
        }
    }
} 

Как я могу получить результат bool для Name2, если он содержит @, используя любое совпадение?

Я пытался использовать следующееКод, но я не знаю, как использовать ИТ для конкретного ключа

result = m.values().stream().anyMatch(v -> v.contains("@"))

Ответы [ 8 ]

0 голосов
/ 01 декабря 2018

Как насчет этого

Map<Integer, String> result = hmap.entrySet() 
                             .stream() 
                             .filter(map -> map.getKey().equals("Name2")) 
                             .collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()))
                             .orElse(null);

Это также обрабатывает исключение NoSuchElementException.

0 голосов
/ 06 июня 2018

Попробуйте это:

boolean result = m.entrySet().stream()
    .filter(e -> e.getKey().equals(Name2))
    .map(Map.Entry::getValue)
    .flatMap(List::stream)
    .anyMatch(s -> s.contains("@"));
0 голосов
/ 06 июня 2018

Вы можете просто использовать m.get("Name2"), поместить (обнуляемый) результат в Optional и затем использовать отображение:

boolean result = Optional.ofNullable(m.get("Name2"))
    .map(l -> l.stream().anyMatch(s -> s.contains("@")))
    .orElse(false);

Это предпочтительнее, чем циклически повторять набор записей, как HashMap.get равен O (1), и итерация по набору записей равна O (n).

0 голосов
/ 06 июня 2018

Выполните следующие действия:

boolean result = m.getOrDefault("Name2", Collections.emptyList()).stream()
    .anyMatch(i -> i.contains("@"));

Если Map содержит правильный ключ, проверьте, содержит ли какой-либо его элемент List как значение определенный символ.Если Map не содержит ключа, смоделируйте пустой Collection, который вообще ничего не содержит, и результат автоматически оценивается как false.

Редактировать: как предложил @Michael,использование Collections.emptyList() - лучший выбор, чем new ArrayList<>().

0 голосов
/ 06 июня 2018

А как же

String name = "Name1";
boolean result= m.containsKey(name) && m.get(name).stream().anyMatch(a -> a.contains("@"));
0 голосов
/ 06 июня 2018

Сначала необходимо выполнить фильтрацию по требуемому ключу, затем вы можете использовать anyMatch, чтобы определить, содержит ли значение этого ключа элемент с символом '@':

result = m.entrySet ()
          .stream ()
          .filter (e->e.getKey ().equals (Name2))
          .anyMatch (e->e.getValue ().stream ().anyMatch (s->s.contains ("@")));
0 голосов
/ 06 июня 2018

Просто добавьте правильное условие фильтра:

m.entrySet()
.stream()
.anyMatch(entry-> entry.getKey().equals(Name2) && 
   entry.getValue()
.stream()
.anyMatch(string -> string.contains("@"))
.getValue();
0 голосов
/ 06 июня 2018

создайте поток из entrySet() и укажите ваши критерии в anyMatch:

result = m.entrySet()
          .stream()
          .anyMatch(v -> Objects.equals("Name2", v.getKey()) && 
               v.getValue().stream().anyMatch(s -> s.contains("@")));

или используя getOrDefault:

result = m.getOrDefault("Name2", Collections.emptyList())
          .stream()
          .anyMatch(s -> s.contains("@"));
...