Java 8 Streams - Gruppierung eines Tupelstroms

8

Bearbeiten :: Ich formuliere die Frage so, dass sie klarer ist

Ich habe diesen Code geschrieben

%Vor%

Ich möchte diese Liste mit Dampf verarbeiten, so dass die Ausgabe eine Karte ist, die Schlüssel (1, 3), (2, 6), (3, 9)

enthält

Also gruppieren wir im Grunde genommen den linken Punkt des Tupels und addieren dann den richtigen Punkt.

Dieser Code wird nicht kompiliert und der Compiler sagt, dass er getLeft, getRight Methoden nicht auflösen kann.

Hier sind die Fehlermeldungen vom Compiler

%Vor%     
Knows Not Much 20.09.2015, 14:11
quelle

2 Antworten

4

Update: Dies beantwortet eine ursprüngliche Frage ( Revision 2 ). Neue Frage wird von @ Shiraaz.M gut beantwortet.

Ihr Comparator akzeptiert ein Paar, daher müssen Sie getRight mit Collectors.mapping :

aufrufen %Vor%

Beachten Sie, dass abhängig vom verwendeten Compiler möglicherweise einige Typen explizit angegeben werden müssen, da die automatische Inferenz möglicherweise fehlschlägt.

Tatsächlich werden solche Szenarien in meiner StreamEx -Bibliothek, die Standard-Java-Streams erweitert, gut unterstützt. Das gleiche Ergebnis kann erreicht werden, indem man dies schreibt:

%Vor%

Beachten Sie schließlich, dass Sie maxBy collector verwenden, wenn Sie Optional -Werte haben, was nutzlos ist, da sie nicht leer sein können. Für maxBy/minBy -Szenarien ist es besser, toMap collector mit benutzerdefinierter Zusammenführungsfunktion zu verwenden:

%Vor%

Oder mit StreamEx:

%Vor%     
Tagir Valeev 20.09.2015, 15:29
quelle
6

Angenommen, Ihre ImmutablePair-Klasse sieht so aus (diese Klasse muss möglicherweise statisch sein, je nachdem, ob der Beispielcode innerhalb einer Hauptmethode ausgeführt wurde):

%Vor%

Das scheint bei mir zu funktionieren:

%Vor%

Und das Ergebnis ist:

  

{1 = 3, 2 = 6, 3 = 9}

Das mögliche Problem

Das Problem ist in diesem Codeabschnitt:

%Vor%

Der Collectors.mapping-Kollektor passt zuerst ein Objekt vom Typ T an und ein Objekt vom Typ U an und führt dann einen Kollektor vom Typ U aus. ( Das ist der Kern des Javadoc für mich )

>

Also, was Sie tun, ist etwas wie:

  • Verwandle ImmutablePair in eine Ganzzahl.
  • Der zweite Parameter ist jetzt ein Collector, der einen Integertyp erwartet, aber Sie verwenden einen ImmutablePair-Typ. Darüber hinaus gibt Comparator.compare () einen Comparator zurück, und Sie möchten einen Integertyp zurückgeben. Um Ihre genaue Codezeile zu korrigieren, müssen Sie sie wie folgt ändern:
  

Collectors.mapping (ImmutablePair :: getRight, Collectors.summingInt (Integer :: valueOf))

Aber Sie brauchen das nicht, weil Sie dies vereinfachen können, indem Sie Collectors.summingInt direkt aufrufen:

  

Collectors.summingInt (ImmutablePair :: getRight)

    
Shiraaz.M 20.09.2015 16:21
quelle

Tags und Links