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ältAlso 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%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
:
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:
Oder mit StreamEx:
%Vor%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:
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)
Tags und Links java java-8 java-stream