이 유형의 객체를 호출 가능한 lambdas로 사용한다는 것은 무엇을 의미합니까? 매우 간단 경우
, 이 문법 설탕 + 인터페이스, 즉 기능 인터페이스[1]의 특정 유형에 대한 익명 클래스에 대한 몇 가지 타입 추론으로 생각 될 수있는 Java 8 람다 :
인터페이스 위에 사용 된 ActionListener에는 하나의 메서드 만 있습니다. 많은 공통 콜백 인터페이스에는 Runnable 및 Comparator와 같은이 속성이 있습니다. 우리는 한 가지 방법을 가진 모든 인터페이스에 기능적 인터페이스 인 을 제공 할 것입니다.
비고 : 람다는 단지 설탕이 아닙니다. 내부적으로는 익명 클래스와 다르게 구현되며, 의미 적으로 차이가 있습니다. 이 문제에 대한 자세한 내용은 ProgrammersExchange의 this excellent answer을 참조하십시오. 그러나 이것은이 질문과 답변의 맥락에서 정말로 중요하지 않습니다.
함수 인터페이스의 값이 예상되는 곳 (메서드 인수, 로컬 변수, 필드 선언 등)에는이 메서드를 구현하는 익명 클래스를 다시 사용하는 엔터티를 만드는 간단한 구문을 사용할 수 있습니다. 즉 람다 표현 :
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();
}
};
그래서 질문은 다음과 같은 방법으로 해석 될 수있다 : 그것은 자바 8 람다 구문을 사용하여 유형
IFn
의 개체를 만들 수 있습니까?
대답은 '아니오'입니다. 람다 구문은 기능 인터페이스에서만 가능합니다. 그것은 훨씬 더 많은 메소드를 포함하고 있기 때문에 clojure.lang.IFn
이 기능 인터페이스 아니므로이 없음
IFn f = (String s) -> s.toLowerCase();
IIRC, Java 8에서는 새로운 방식으로 람다 함수를 "호출"할 수 없습니다. 단일 함수 인터페이스 여야하는 람다 함수를 생성하는 새로운 방법을 제공합니다. –