java - Collectors.toMap 仅当存在可选值时

标签 java java-stream option-type collectors

我有一个语言列表,如英语、法语等。我还有一个单词列表,如苹果、橙子等。对于每个单词,我想创建一个如下所示的 map :

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

为了获得 translatedWord,我有一个返回可选的函数。该方法的签名如下所示:

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

这是我编写的用于将单词收集到 map 中的代码

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

最佳答案

收集前先过滤:

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

但是,流在这里并没有增加那么多的值(value)。你可以只使用一个循环:

Map<Language, TranslatedWord> map = new HashMap<>();
for (Language lang : languages) {
  getTranslatedWord(w, lang)
      .ifPresent(t -> map.put(lang, t));
}

关于java - Collectors.toMap 仅当存在可选值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56429075/

相关文章:

php - 如何告诉 PHP 在函数调用中使用默认参数?

Swift:似乎不允许比较字符串?用一个字符串?

java - 尝试java中的所有可能性

java - 不存在类型变量 U 的实例,因此 Optional<U> 符合 Response

java - android 通过 Skype 使用 ACTION_SEND 共享内容(文本+图像),仅共享图像而不共享文本

java - 使用流过滤集合以获取其属性在 Java 8 中出现 n 次的项目

Java 8 - 如何将数组列表转换为特定类对象的列表

java - 使用 lambda 创建包含空对象的 ArrayList

java - .prpt 报告从 java 运行

java - 如何设计删除时的多对多关系?