Was meinen Sie, Objekte dieses Typs als aufrufbare Lambdas verwenden?
In sehr einfach Fällen Java 8 lambdas kann für anonyme Klassen für bestimmte Arten von Schnittstellen, nämlich funktionalen Schnittstellen[1] als syntaktischer Zucker + einige Typinferenz gedacht werden:
Die Schnittstelle ActionListener, oben verwendet, hat nur eine Methode. Viele gemeinsame Callback-Schnittstellen haben diese Eigenschaft, wie zum Beispiel Runnable und Comparator. Wir geben allen Schnittstellen, die nur eine Methode haben, einen Namen: funktionale Schnittstellen.
Bemerkung: lambdas sind wirklich nicht nur ein Zucker; intern werden sie anders als anonyme Klassen implementiert, und es gibt auch einige semantische Unterschiede; Weitere Informationen hierzu finden Sie unter this excellent answer auf ProgrammersExchange. Dies ist jedoch im Zusammenhang mit dieser Frage und Antwort nicht wirklich wichtig.
Überall dort, wo ein Wert einer funktionalen Schnittstelle erwartet wird (Methodenargument, lokale Variable, Felddeklaration usw.), kann kurze Syntax verwendet werden, um eine anonyme Klasse zu erstellen, die diese Methode implementiert, dh ein Lambda Ausdruck:
Runnable r =() -> {
System.out.println("Hi");
};
// Equivalent to
Runnable r = new Runnable() {
public void run() {
System.out.println("Hi");
}
};
public interface Function<F, T> {
T call(F arg);
}
Function<String, char[]> c = s -> ("<" + s + ">").toCharArray();
// Equivalent to
Function<String, char[]> c = new Function<>() {
public char[] call(String s) {
return ("<" + s + ">").toCharArray();
}
};
So kann Ihre Frage nur in folgenden Weise interpretiert wird: ist es möglich, Objekte des Typs zu schaffen IFn
Java 8 Lambda-Syntax?
Die Antwort ist nein. Lambda-Syntax ist nur mit funktionalen Schnittstellen möglich. clojure.lang.IFn
keine funktionale Schnittstelle ist, weil es viel mehr als nur einzelne Methode enthält, so wird es nicht möglich sein, so etwas wie
IFn f = (String s) -> s.toLowerCase();
IIRC, Java 8 lässt Sie Lambdafunktionen nicht auf neue Weise "aufrufen"; Es bietet nur neue Möglichkeiten für _create_ Lambda-Funktionen, bei denen es sich um Einzelfunktionsschnittstellen handeln muss. –