2015-08-10 9 views
13

Ich habe versucht, Map.Entry Comparator in Java8 mit Lambda-Ausdrücke und haben ein sehr seltsames Verhalten gefunden.Java 8 Map.Entry Komparator

Map<Integer, String> map = new TreeMap<>(); 

map.put(1, "Hello"); 
map.put(3, "zzzz"); 
map.put(2, "aaaa"); 
map.put(5, "AAAAA"); 
map.put(4, "aaaa"); 

Comparator<Map.Entry<Integer, String>> com = Comparator.comparing(Map.Entry::getValue); 
com = com.reversed(); 

Comparator<Map.Entry<Integer, String>> com2 = Comparator.comparing(Map.Entry::getValue).reversed(); 

com ganz gut funktioniert, aber com2 enthält ein Misstake "nicht Methode getValue lösen". Und ich weiß wirklich nicht warum? Irgendwelche Vorschläge?

P.S. Gibt es eine Möglichkeit, die Eingabe zu vermeiden Map.Entry mit Integer, String? Jeder kürzere Weg?

+0

Dies scheint eine Einschränkung zu sein, wie der Java-Compiler die generischen Parameter und den Rückgabetyp eines Lambda ableitet, also gibt es hier wahrscheinlich nicht viel zu tun. Sie können auf die nächste Version des Compilers warten, die intelligenter sein kann. :) – biziclop

Antwort

19

da Java-8 gibt es eine eigenständige Methode Entry.comparingByValue die stattdessen verwendet werden kann:

Comparator<Map.Entry<Integer, String>> com2 = 
     Map.Entry.<Integer, String>comparingByValue().reversed(); 

eine alternative Möglichkeit, das gleiche zu tun ist, um die Parameter zu übergeben:

Comparator<Map.Entry<Integer, String>> com2 = 
     Map.Entry.comparingByValue(Comparator.reverseOrder()); 

Diese Art Argument Argumente sind nicht erforderlich.

14

Derzeit geben Sie den Raw-Typ an, wenn Sie den Methodenverweis angeben - im ersten Fall teilt der generische Typ-Schluss mit der Zuweisung dem Compiler mit, was Sie meinen, aber das funktioniert nicht für das Ziel eines Methodenaufrufs. Sie können den generischen Typ für die Methode Referenz angeben obwohl:

Comparator<Map.Entry<Integer, String>> com2 = 
    Comparator.comparing(Map.Entry<Integer,String>::getValue).reversed(); 

(. Ich weiß, das ist die Anzahl der Male zu erhöhen Sie Map.Entry<Integer, String> in Ihrem Code benötigen, aber leider das ist schwer hier zu vermeiden)

+0

Danke, als auf jeden Fall funktioniert! Obwohl Intellij dieselbe Warnung anzeigt. Aber kann ich vermeiden, so viel Map.Entry ? –

+1

@ ДмитрийКиселев: Sie * können * in der Lage sein damit zu kommen, indem Sie Ihre eigenen Hilfsmethoden schreiben, die 'reverse' aufrufen, aber sie wären auf andere Weise hässlich ... –

Verwandte Themen