【问题标题】:Collectors.toMap only if optional value is present仅当存在可选值时 Collectors.toMap
【发布时间】:2019-06-03 14:09:00
【问题描述】:

我有一个语言列表,如英语、法语等。我还有一个单词列表,如 apple、orange 等。对于每个单词,我想创建一个如下所示的地图:

地图地图 = {english = apple, italian = mela}

为了得到翻译后的Word,我有一个返回可选的函数。该方法的签名如下所示:

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 中。我怎样才能做到这一点?

【问题讨论】:

    标签: java java-stream optional collectors


    【解决方案1】:

    收集前过滤:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这里出现的直接问题是getTranslatedWord 在单个管道中被调用了两次。
      • 是的。这是非常有道理的担忧。我认为@Andy Terner 的另一个答案很好,他在过滤之前映射了数据。
      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2020-12-09
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多