从列表<字符串>

时间:2019-05-13 09:50:48

标签: java collections mapping java-stream

我有一些具有语法的简单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的每个结果的键和值。由于没有为该方法的结果分配变量名,应该怎么做?也许我正在尝试一种错误的方法?

1 个答案:

答案 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调用中添加合并功能。