Eu quero converter:
Map<String, Map<String, List<Map<String, String>>>> inputMap
para:
Map<String, Map<String, CustomObject>> customMap
inputMap
é fornecido na configuração e está pronto, mas eu preciso customMap
formatar. O CustomObject será derivado do List<Map<String, String>>
uso de poucas linhas de código em uma função.
Tentei uma maneira normal de iterar o mapa de entrada e copiar valores-chave no customMap. Existe alguma maneira eficiente de fazer isso usando o Java 8 ou algum outro atalho?
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
motoqueiro Fantasma
fonte
fonte
Respostas:
Uma solução é transmitir o fluxo
entrySet
deinputMap
e depois usarCollectors#toMap
duas vezes (uma para o exteriorMap
e outra para o interiorMap
):fonte
{}
instrução e o retorno no lambda, algo como isto:.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Você pode transmitir, mas isso não parecerá legível; pelo menos para mim. Então, se você tem um método:
você ainda pode usar a
java-8
sintaxe, mas de uma forma diferente:Se você pode fazer o mapa interno
immutable
, pode torná-lo ainda mais curto:fonte
IMHO streaming não é uma idéia tão ruim. Não há ferramentas ruins. Depende de como você os está usando.
Nesse caso em particular, eu extrairia o padrão de repetição em um método utilitário:
O método acima pode ser implementado usando qualquer abordagem, embora eu acho que
Stream API
se encaixa muito bem aqui.Depois de definir o método utilitário, ele pode ser usado da seguinte maneira:
A transformação real é efetivamente uma linha. Assim, com adequada
JavaDoc
paratransformValues
o método código de resultado é bastante legível e de fácil manutenção.fonte
Que tal
Collectors.toMap
para as entradas nos níveis externo e interno, como:fonte