2016-06-20 4 views
3

Ich versuche, Daten von diesem Format zu transformieren:Verwenden Ströme zu Gruppe Map <Foo, List <Bar>> basierend auf Größe der Liste <Bar>

Map<Foo, List<Bar>> mapFooToBars;   //start Map 
Map<Integer, List<Foo>> mapListSizeToFoos //destination Map 

Ich mag eine Gruppierung erstellen, die auf der Basis Größe der List<Bar> für jeden Eintrag, so dass in meiner Ausgabe Karte würde ich eine Liste aller Foos, die 0 Bars zusammen haben, alle Foos, die 1 Bar zusammen haben, und so weiter.

Ich habe versucht, dies zu tun:

Map<Foo, List<Bar>> fooBarMap = whatever(); 
fooBarMap.entrySet().stream() 
    .collect(Collectors.groupingBy(entry -> entry.getValue().size())); 
//expected Map<Integer,Entry<Foo, List<Bar>> which 
//could be transformed into Map<Integer,Foo> pretty easily 

Ich bin offenbar unklar, wie groupingBy funktioniert genau, wie das ist mir ein „getValue() für den Typ Object nicht definiert ist“ geben Fehler. Irgendwo entlang der Linie verliere ich die Art Informationen über entrySet, denke ich? Ich fragte mich, ob das nicht der beste Weg war. Jede Hilfe wird geschätzt!

+1

ich diesen Fehler bin nicht immer davon ausgegangen, muss es etwas anderes passiert in Ihrem realen Code sein? –

+3

'Map >>>' ist der richtige Typ und es kompiliert. – zapl

+0

groupingBy wird Einträge sammeln, nicht foos –

Antwort

6

Sie sind auf dem richtigen Weg. Sie sollten groupingBy, aber mit mapping(Map.Entry::getKey, toList()) als zweiten Parameter verwenden. Dies wird die Schlüssel in einer Liste sammeln und diese Listen werden die Werte der resultierenden Karte sein.

fooBarMap.entrySet().stream() 
    .collect(groupingBy(
     e -> e.getValue().size(), 
     mapping(Map.Entry::getKey, toList()) 
    )); 

über statische Einfuhren von verschiedenen Sammlern

+0

Wie ich oben erwähnt habe, stellte sich heraus, dass mein Problem mit einer falschen Interpretation des Rückgabewerts in meinem Produktionscode zusammenhing, aber ich schätze diese Antwort, die hilft zu erklären, wie man groupingBy verwendet, also werde ich dies als Antwort akzeptieren . :) –

Verwandte Themen