2013-01-22 1 views
13

Clojure에서 "clojure.lang.IFn"인터페이스를 준수하는 고차 함수를 생성하는 여러 라이브러리를 사용합니다.Clojure 함수를 Java 8의 Lambdas로 사용할 수 있습니까?

이것은 다수의 아티 (arity) 오버로드를 갖는다.

public interface IFn extends Callable, Runnable{ 
    public Object invoke() ; 
    public Object invoke(Object arg1) ; 
    public Object invoke(Object arg1, Object arg2) ; 
    public Object invoke(Object arg1, Object arg2, Object arg3) ; 
    .... etc. 
    public Object applyTo(ISeq arglist) ; 
} 

내가 직접 자바 8 개로 호출 람다 함수에서이 형식의 개체를 사용할 수 있습니다 : 인터페이스 뭔가처럼 보인다?

+5

IIRC, Java 8에서는 새로운 방식으로 람다 함수를 "호출"할 수 없습니다. 단일 함수 인터페이스 여야하는 람다 함수를 생성하는 새로운 방법을 제공합니다. –

답변

7

이 유형의 객체를 호출 가능한 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(); 
+5

Java 8 람다가 익명의 내부 클래스에서 문법적인 설탕이라는 생각은 그냥 사라지지 않는 밈입니다. 왜이 질문에 대한 답을 보려면 http://programmers.stackexchange.com/questions/177879/type-inference-in-java-8을 참조하십시오. 이것은 분명히 빈번한 질문이 될 것입니다. 람다 FAQ (http://www.lambdafaq.org) –

+0

@MauriceNaftalin에 대한 답변을 드리겠습니다. 고맙습니다. 람다 사양을 더 철저히 읽어야했습니다. 그것에 대한 통지를 추가하고 있습니다. –

+1

질문에 대한 나의 해석은 여기에있는 것과 반대입니다.나는 인터페이스 IFn을 구현하는 객체 인 clojure 함수를 단일 함수 인터페이스를 구현하는 객체를 기대하는 자바 함수에 전달하려고한다고 생각한다. 내가 의심하는 대답은 '아니오'입니다. – bfabry

2

처럼 뭔가를 할 수 없습니다, 그들이 또한 유효한 자바있는 것 같은 Clojure의 기능을 사용할 수 없습니다 보인다 람다. Clojure의 IFn은 정의 된 java의 "lambda"기능 인터페이스를 준수하지 않습니다.

관련 문제