Ich habe diese Klasse:
class A {
private List<String> keys;
private String otherData;
private int otherDate2;
// getter and setters for each
}
Für diese Klasse habe ich eine einfache Liste mit einigen Daten gefüllt. List<A> listOfA
. Jetzt möchte ich diese Daten auf eine Karte konvertieren.Map<String, List<A>>
Derzeit eine Reihe von Methoden , die wir dies in einem sehr komplizierten Weg zur Archivierung verwendet wird . Ich denke, wir haben es mit einem einfachen lösen kann stream()
-Betrieb.
Ich habe versucht, diese
// first
listOfA.stream()
.collect(Colletors.groupingBy(a -> a.getKeys()))
// produces a Map<String, List<A>>
// second
listOfA.stream()
.flatMap(a -> a.getKeys().stream())
.collect(Colletors.groupingBy(string -> string))
// produces a Map<String, List<String>>
Was ist der richtige Weg für diese Situation?
Edit: Um es klar, ich will ein Map<String, List<A>>
.
Sie haben keine Streams für diese benötigen. Es ist einfacher, auf diese Weise:
Map<String, List<A>> result = new HashMap<>();
listOfA.forEach(a -> a.getKeys().forEach(key ->
result.computeIfAbsent(key, k -> new ArrayList<>()).add(a)));
Diese iteriert äußeren und innere Listen und füllt eine Map
Verwendung computeIfAbsent
, die eine leere Liste erstellt , wenn es noch kein Wert für den angegebenen Schlüssel ist, dann A
Instanzen werden in der entsprechenden Liste einfach hinzugefügt.