Collectors.toMap, только если присутствует необязательное значение - PullRequest
3 голосов
/ 03 июня 2019

У меня есть список языков, таких как английский, французский и т. Д. У меня также есть список слов, таких как яблоко, апельсин и т. Д. Для каждого слова я хочу создать карту, которая выглядит следующим образом:

Map map = {english = apple, italian = mela}

Для того, чтобы получить translationWord, у меня есть функция, которая возвращает необязательный.Подпись метода выглядит следующим образом:

Optional<TranslatedWord> getTranslatedWord(String word, Language language);

Это код, который я написал для сбора слов в карту

List<Language> languages = {english, italian, french};
for(String w : words) {
   Map<Language, TranslatedWord> map = languages.stream().collect(Collectors.ToMap(language -> language,
      language -> getTranslatedWord(w, language));

   doSomethingWithThisMap(map);
}

Проблема в том, что getTranslatedWord () возвращает Необязательный.Мне нужно собрать его в карту, только если в необязательном значении есть значение.Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 03 июня 2019

Фильтр перед сбором:

Map<Language, TranslatedWord> map =
    languages.stream()
        .map(lang -> new AbstractMap.SimpleEntry<>(lang, getTranslatedWord(w, lang)))
        .filter(e -> e.getValue().isPresent())
        .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get()));

Тем не менее, потоки здесь не так уж важны. Вы можете просто использовать цикл:

Map<Language, TranslatedWord> map = new HashMap<>();
for (Language lang : languages) {
  getTranslatedWord(w, lang)
      .ifPresent(t -> map.put(lang, t));
}
0 голосов
/ 03 июня 2019

Просто поместите фильтр перед тем, как собирать в карту

    for(String w : words) {
        Map<Language, TranslatedWord> map = languages.stream()
                .map(lang -> new AbstractMap.SimpleEntry<>(lang, getTranslatedWord(w, lang)))
                .filter(e -> e.getValue().isPresent())
                .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().get()));

       doSomethingWithThisMap(map);
    }
...