Co masz na myśli, używaj obiektów tego typu jako kaloszy lambdas?
W bardzo prostych przypadkach Java 8 lambdas mogą być traktowane jako cukru składniowej + jakiś rodzaj wnioskowania do anonimowego klas dla pewnego typu interfejsów, mianowicie interfejsów funkcjonalnych[1]:
Interfejs ActionListener, użyty powyżej, ma tylko jedną metodę. Wiele wspólnych interfejsów wywołań zwrotnych ma tę właściwość, na przykład Runnable i Comparator. Damy wszystkim interfejsom, które mają tylko jedną metodę, nazwę: interfejsy funkcjonalne.
Uwaga: lambdy naprawdę nie są tylko cukrem; wewnętrznie są one implementowane inaczej niż anonimowe klasy, a także istnieją pewne różnice semantyczne; zobacz this excellent answer na ProgrammersExchange po więcej informacji na ten temat. Nie jest to jednak tak ważne w kontekście tego pytania i odpowiedzi.
Wszędzie tam, gdzie oczekiwana jest wartość jakiegoś interfejsu funkcjonalnego (argument metody, zmienna lokalna, deklaracja pola itp.) Możliwe będzie użycie krótkiej składni do stworzenia obiektu przypominającego klasę anonimową implementującą tę metodę, czyli lambda wyrażenie:
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();
}
};
Więc pytanie może być interpretowane tylko w następujący sposób: jest to możliwe, aby utworzyć obiekty typu IFn
wykorzystaniem Java 8 składni lambda?
Odpowiedź brzmi: nie. Składnia Lambda jest możliwa tylko z funkcjonalnymi interfejsami. clojure.lang.IFn
nie jest funkcjonalny interfejs, ponieważ zawiera dużo więcej niż jednej metody, więc nie będzie to możliwe, aby zrobić coś jak
IFn f = (String s) -> s.toLowerCase();
IIRC, Java 8 nie pozwala na "wywoływanie" funkcji lambda w jakikolwiek nowy sposób; zapewnia tylko nowe sposoby tworzenia _ funkcji lambda, które muszą być interfejsami jednofunkcyjnymi. –