Je veux convertir:
Map<String, Map<String, List<Map<String, String>>>> inputMap
à:
Map<String, Map<String, CustomObject>> customMap
inputMap
est fourni dans la config et est prêt mais j'ai besoin de customMap
formater. CustomObject sera dérivé de l' List<Map<String, String>>
utilisation de quelques lignes de code dans une fonction.
J'ai essayé une manière normale d'itérer la carte d'entrée et de copier les valeurs clés dans customMap. Existe-t-il un moyen efficace de le faire en utilisant Java 8 ou un autre raccourci?
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
cavalier fantôme
la source
la source
Réponses:
Une solution consiste à diffuser le
entrySet
deinputMap
, puis à utiliserCollectors#toMap
deux fois (une pour l'extérieurMap
et une pour l'intérieurMap
):la source
{}
et la déclaration de retour dans la lambda, quelque chose comme ceci:.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Vous pouvez diffuser, mais cela ne semblera pas lisible; au moins pour moi. Donc, si vous avez une méthode:
vous pouvez toujours utiliser la
java-8
syntaxe, mais sous une forme différente:Si vous pouvez faire la carte intérieure
immutable
, vous pouvez la raccourcir encore plus:la source
Le streaming à mon humble avis n'est pas une si mauvaise idée. Il n'y a pas de mauvais outils. Cela dépend de la façon dont vous les utilisez.
Dans ce cas particulier, j'extrais le motif répétitif dans une méthode utilitaire:
La méthode ci-dessus peut être implémentée en utilisant n'importe quelle approche, bien que je pense qu'elle
Stream API
convient assez bien ici.Une fois que vous avez défini la méthode utilitaire, elle peut être utilisée de la manière suivante:
La transformation réelle est en fait un revêtement. Ainsi, avec la méthode appropriée
JavaDoc
pourtransformValues
le code de résultat est assez lisible et maintenable.la source
Que diriez-vous
Collectors.toMap
pour les entrées à la fois à un niveau extérieur et intérieur tels que:la source