Ich möchte konvertieren:
Map<String, Map<String, List<Map<String, String>>>> inputMap
zu:
Map<String, Map<String, CustomObject>> customMap
inputMap
wird in der Konfiguration bereitgestellt und ist bereit, aber ich muss customMap
formatieren. CustomObject wird aus der List<Map<String, String>>
Verwendung weniger Codezeilen in einer Funktion abgeleitet.
Ich habe versucht, die Eingabekarte auf normale Weise zu iterieren und Schlüsselwerte in customMap zu kopieren. Gibt es eine effiziente Möglichkeit, dies mit Java 8 oder einer anderen Verknüpfung zu tun?
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
Geisterfahrer
quelle
quelle
Antworten:
Eine Lösung besteht darin, das
entrySet
von zu streameninputMap
und dannCollectors#toMap
zweimal zu verwenden (einmal für das ÄußereMap
und einmal für das InnereMap
):quelle
{}
und die return-Anweisung im Lambda weglassen ,.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Sie könnten streamen, aber das wird nicht lesbar aussehen. Zumindest für mich. Wenn Sie also eine Methode haben:
Sie könnten die
java-8
Syntax weiterhin verwenden , jedoch in einer anderen Form:Wenn Sie die innere Karte erstellen können
immutable
, können Sie diese noch kürzer machen:quelle
IMHO Streaming ist keine so schlechte Idee. Es gibt keine schlechten Werkzeuge. Es hängt davon ab, wie Sie sie verwenden.
In diesem speziellen Fall würde ich das sich wiederholende Muster in eine Dienstprogrammmethode extrahieren:
Die obige Methode kann mit jedem Ansatz implementiert werden, obwohl ich denke, dass sie
Stream API
hier ziemlich gut passt.Sobald Sie die Dienstprogrammmethode definiert haben, kann sie wie folgt verwendet werden:
Die eigentliche Transformation ist effektiv ein Liner. So mit der richtigen
JavaDoc
fürtransformValues
Methode ist das Ergebnis Code ziemlich lesbar und wartbar.quelle
Wie wäre es mit
Collectors.toMap
den Einträgen sowohl auf äußerer als auch auf innerer Ebene wie:quelle