仅当存在可选值时,才使用Collectors.toMap

时间:2019-06-03 14:09:00

标签: java java-stream optional collectors

我有一个语言列表,例如英语,法语等。我也有一个单词列表,例如苹果,橘子等。对于每个单词,我想创建一个看起来像这样的地图:

地图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()返回Optional。仅当可选参数中包含值时,我才需要将其收集到Map中。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:6)

在收集之前进行过滤:

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));
}

答案 1 :(得分:-1)

在收集到地图之前只需放置一个过滤器

    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);
    }
相关问题