Я хочу конвертировать:
Map<String, Map<String, List<Map<String, String>>>> inputMap
чтобы:
Map<String, Map<String, CustomObject>> customMap
inputMap
предоставляется в конфиге и готов, но мне нужно customMap
отформатировать. CustomObject будет получен из List<Map<String, String>>
использования нескольких строк кода в функции.
Я попробовал нормальный способ итерации входной карты и копирования значений ключей в customMap. Есть ли эффективный способ сделать это, используя Java 8 или другой ярлык?
Map<String, Map<String, List<Map<String, String>>>> configuredMap = new HashMap<>();
Map<String, Map<String, CustomObj>> finalMap = new HashMap<>();
for (Map.Entry<String, Map<String, List<Map<String, String>>>> attributeEntry : configuredMap.entrySet()) {
Map<String, CustomObj> innerMap = new HashMap<>();
for (Map.Entry<String, List<Map<String, String>>> valueEntry : attributeEntry.getValue().entrySet()) {
innerMap.put(valueEntry.getKey(), getCustomeObj(valueEntry.getValue()));
}
finalMap.put(attributeEntry.getKey(), innerMap);
}
private CustomObj getCustomeObj(List<Map<String, String>> list) {
return new CustomObj();
}
java
collections
java-8
java-stream
Призрачный гонщик
источник
источник
Ответы:
Одним из решений является потоковая передача
entrySet
изinputMap
, а затем использованиеCollectors#toMap
дважды (один раз для внешнегоMap
и один раз для внутреннегоMap
):источник
{}
оператор return и return в.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Вы могли бы передавать, но это не будет выглядеть читабельным; по крайней мере для меня. Так что если у вас есть метод:
вы все еще можете использовать
java-8
синтаксис, но в другой форме:Если вы можете сделать внутреннюю карту
immutable
, вы можете сделать это еще короче:источник
ИМХО потоковое не очень плохая идея. Там нет плохих инструментов. Это зависит от того, как вы их используете.
В этом конкретном случае я бы извлек повторяющийся шаблон в служебный метод:
Описанный выше метод может быть реализован с использованием любого подхода, хотя я думаю, что он
Stream API
подходит здесь.После того как вы определили служебный метод, его можно использовать так же просто, как показано ниже:
Фактическое преобразование - фактически один лайнер. Так что с собственно
JavaDoc
дляtransformValues
метода коды результата довольно читаемые и ремонтопригодны.источник
Как насчет
Collectors.toMap
записей как на внешнем, так и на внутреннем уровне, таких как:источник