我有一些具有语法的简单JSON文件
"key1": "value1"
"key2": "value2"
等
我需要根据它们各自创建一个Map,然后将它们合并为一个。以下代码按预期工作:
private TranslationBundle assembleBundle(List<String> translations) {
TranslationBundle translationBundle = new TranslationBundle();
Map<String, String> bundledTranslationMap = new HashMap<>();
translations.forEach(translation -> {
bundledTranslationMap.putAll(getSingleTranslationMap(translation).);
});
translationBundle.setTranslationMap(bundledTranslationMap);
return translationBundle;
}
private Map<String, String> getSingleTranslationMap(String translation){
ObjectMapper mapper = new ObjectMapper();
try{
return mapper.readValue(translation, new TypeReference<Map<String, String>>(){});
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
我想要实现的是将assembleBundle
方法中的代码重写为功能更强大的方法,例如
translations.stream().
map(this::getSingleTranslationMap)
.collect(collect to single HashMap);
据我所知,在collect()
方法中,我必须以某种方式访问getSingleTranslationMap
的每个结果的键和值。由于没有为该方法的结果分配变量名,应该怎么做?也许我正在尝试一种错误的方法?
答案 0 :(得分:4)
您可以将Map
返回的各个getSingleTranslationMap
转换成地图条目的Stream
,然后将它们收集到一个Map
中:
Map<String, String> bundledTranslationMap =
translations.stream()
.flatMap(translation -> getSingleTranslationMap(translation).entrySet()
.stream())
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
当然,如果getSingleTranslationMap
返回带有单个Map
的{{1}},则该方法返回Entry
而不是{{1 }},这将简化上述Map.Entry
管道。
P.S。,如果可能有重复的键,则应在Map
调用中添加合并功能。