Ich war auf der Suche durch Java-Quellcode für die Map
Schnittstelle und lief in diesen kleinen Code-Schnipsel:Java Lambda-Ausdrücke, Gießen und Komparatoren
/**
* Returns a comparator that compares {@link Map.Entry} in natural order on value.
*
* <p>The returned comparator is serializable and throws {@link
* NullPointerException} when comparing an entry with null values.
*
* @param <K> the type of the map keys
* @param <V> the {@link Comparable} type of the map values
* @return a comparator that compares {@link Map.Entry} in natural order on value.
* @see Comparable
* @since 1.8
*/
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
Von der Methode Erklärung erhalte ich, dass dies eine generische Methode ist das gibt einen Comparator eines Typs zurück, der entweder von den Map-Einträgen abgeleitet oder explizit in der Methode angegeben wurde.
Was mich wirklich abschreckt ist der Rückgabewert. Es scheint, dass der Lambda-Ausdruck
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
explizit auf eine Comparator<Map.Entry<K, V>>
gegossen wird. Ist das richtig?
Ich bemerkte auch, dass die scheinbare Besetzung enthält & Serializable
. Ich habe noch nie eine Schnittstelle in Verbindung mit einer Klasse in einer Besetzung vor, aber es sieht aus wie die folgenden gültigen im Compiler gesehen:
((SubClass & AnInterface) anObject).interfaceMethod();
Obwohl die folgenden nicht funktioniert:
public class Foo {
public static void main(String[] args) {
Object o = new Foo() {
public void bar() {
System.out.println("nope");
}
};
((Foo & Bar) o).bar();
}
}
interface Bar {
public void bar();
}
So
, zwei Fragen:
Wie eine Schnittstelle zu einem Guss wirkt sich das Hinzufügen funktionieren soll? Erzwingt dies nur den Rückgabetyp der Methode einer Schnittstelle?
Können Sie einen Lambda-Ausdruck in eine
Comparator
umwandeln? Was können sie sonst noch werfen? Oder ist ein Lambda-Ausdruck im Wesentlichen nur einComparator
? Kann jemand das alles klären?
offensichtlich nicht initialisieren. Ein Lambda kann zu irgendeiner Schnittstelle mit einer einzelnen abstrakten Methode umgewandelt werden, deren Unterschrift dem Körper des Lambda entspricht. –
Aargh, 'Seralizable'! – fge
http://www.java2s.com/Tutorials/Java/Java_Lambda/0080__Java_Intersection_Type.htm –