你是什麼意思,使用這種類型的對象作爲可調用的lambdas?
在非常簡單箱子,爪哇8層的lambda 可以被認爲是語法糖+匿名類中的某些類型推斷對於某些類型的接口,即功能接口[1]:
接口上面使用的ActionListener只有一個方法。很多 常見的回調接口都有這個屬性,比如Runnable和 比較器。我們將給所有隻有一個方法的接口提供一個名稱:功能接口 。
備註:lambdas真的不只是一個糖;在內部它們的實現方式與匿名類不同,並且也存在一些語義差異;有關此事的更多信息,請參見ProgrammersExchange上的this excellent answer。但是,在這個問題和答案中,這並不重要。
任何需要某個函數接口的值的地方(方法參數,局部變量,字段聲明等),可以使用短語法來創建實現此方法的匿名類的實體,也就是lambda表情:
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();
}
};
所以你的問題只能通過以下方式解釋:是否有可能創建使用Java 8 lambda語法IFn
類型的對象?
答案是否定的。 Lambda語法僅適用於功能接口。 clojure.lang.IFn
是不是功能界面,因爲它包含了比單一方法多得多,所以它不可能做這樣的事情
IFn f = (String s) -> s.toLowerCase();
IIRC,Java 8不允許您以任何新方式「調用」lambda函數;它只提供了_create_ lambda函數的新方法,它必須是單功能接口。 –