2017-03-27 3 views
3

Die unten Stream-Ausdruck funktioniert völlig in Ordnung:Warum funktioniert die Sortierung (Comparator :: reverseOrder) nicht?

Stream<String> s = Stream.of("yellow","blue", "white"); 
s.sorted(Comparator.reverseOrder()) 
    .forEach(System.out::print);` //yellowwhiteblue 

Warum nicht kompiliert das Äquivalent eines mit Methode Referenzen?

s.sorted(Comparator::reverseOrder).forEach(System.out::print); 

Der Typ Vergleicher wird nicht definiert, Folgeumgekehrt (String, String), dass anwendbar ist hier

+2

Warum denken Sie, dass 'Comparator.reverseOrder()' und 'Comparator :: reverseOrder' äquivalent sind? Denkst du, das war eine andere Syntax für die gleiche Sache? War das der Sinn darin? – Holger

Antwort

4

Verfahren Referenz sagt Java „behandeln diese Methode als die Implementierung eines Single-Methode Schnittstelle "- das heißt, die Methodenreferenz sollte die Signatur int foo(String,String) haben und somit Comparator<String> implementieren.

Comparator.reverseOrder() nicht - es gibt eine Comparator Instanz zurück. Da sortedfür a Comparator sucht, kann es das Ergebnis des Methodenaufrufs übernehmen, aber es kann diese Methode nicht als Schnittstellenimplementierung verwenden.

0

Die Codezeile mit Methodenreferenz s.sorted (Comparator :: reverseOrder) teilt Java mit, dass es eine statische Methode mit der Signatur eines trivialen Methodenvergleichers gibt, dh mit zwei Parametern.

Die Klasse Vergleicher hat nur die statische Methode Folgeumgekehrt ohne Parameter, dass der Grund des Übersetzungsfehlers ist.

Verwandte Themen