Collectors.toMap 仅当存在可选值时
Collectors.toMap only if optional value is present
我有一个语言列表,如英语、法语等。我还有一个单词列表,如苹果、橙子等。对于每个单词,我想创建一个如下所示的地图:
地图地图={英语=苹果,意大利语=梅拉}
为了得到 translatedWord,我有一个 returns 可选的函数。该方法的签名如下所示:
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() returns 一个可选的。仅当可选项中有值时,我才需要将它收集到 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()));
但是,流在这里并没有增加那么多的价值。你可以只使用一个循环:
Map<Language, TranslatedWord> map = new HashMap<>();
for (Language lang : languages) {
getTranslatedWord(w, lang)
.ifPresent(t -> map.put(lang, t));
}
在收集到地图之前先放一个过滤器
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);
}
我有一个语言列表,如英语、法语等。我还有一个单词列表,如苹果、橙子等。对于每个单词,我想创建一个如下所示的地图:
地图地图={英语=苹果,意大利语=梅拉}
为了得到 translatedWord,我有一个 returns 可选的函数。该方法的签名如下所示:
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() returns 一个可选的。仅当可选项中有值时,我才需要将它收集到 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()));
但是,流在这里并没有增加那么多的价值。你可以只使用一个循环:
Map<Language, TranslatedWord> map = new HashMap<>();
for (Language lang : languages) {
getTranslatedWord(w, lang)
.ifPresent(t -> map.put(lang, t));
}
在收集到地图之前先放一个过滤器
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);
}