Создать HashMap из списка <String> - PullRequest
2 голосов
/ 13 мая 2019

У меня есть несколько простых файлов JSON с синтаксисом

"key1": "value1"
"key2": "value2"

и т.д.

Мне нужно создать Карту из каждого из них, а затем объединить их в одну. Следующий код работает так, как предполагается:

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 Ответ

4 голосов
/ 13 мая 2019

Вы можете преобразовать отдельные Map s, возвращенные 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 с одним Entry, для этого метода может иметь смысл возвращать Map.Entry вместо Map, что упростит вышеприведенный Stream трубопровод.

P.S., Если возможны дубликаты ключей, вы должны добавить функцию слияния к вызову toMap().

...