GROUPBY eine Liste von Strings

Akop:

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>>.

Federico Peralta Schaffner:

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 MapVerwendung computeIfAbsent, die eine leere Liste erstellt , wenn es noch kein Wert für den angegebenen Schlüssel ist, dann AInstanzen werden in der entsprechenden Liste einfach hinzugefügt.

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=178071&siteId=1
Empfohlen
Rangfolge