2016-05-31 2 views
2
내가 특정 인터페이스

한 라이너 클래스 인스턴스 구현

그것은 한 줄 클래스 인스턴스 구현을 만들 수 있습니다를 구현하는 인스턴스를 얻을 필요가

?

+3

인터페이스 (기능적 인터페이스입니까?) 및 필요한 구현. – Eran

+4

또한 회선의 길이에 따라 달라집니다. –

+2

예. 한 라인이 보이는 것은 인터페이스의 복잡성에 달려 있습니다. – khelwood

답변

6

인터페이스는 기능적 인터페이스의 경우 자바 8에서는, 사용자가 방식 참조 통해 람다 식을 통해 또는 간단한 경우로 정의 할 수있다 (단 하나 개의 추상있어서, 아래 참조)

람다 :

Runnable runnable =() -> System.out.println("I am a runnable"); 

방법 참조 :

Predicate<Character> uppercase = Character::isUpperCase; 

주 : 기능 인터페이스 필요하지 않은 재치를 주석 수 h @FunctionalInterface이지만 인터페이스가 정확히 하나의 추상화가 아닌 경우 (default, static이 아닌 경우, @FunctionalInterface) 주석 달기에는 컴파일 타임 오류가 발생합니다 (주석이 비슷한 방식으로 유용합니다 ~ @Override).

참조 :

의견에 91,363,210

업데이트 응답 :

예, 정의하고 oneliner과 람다를 사용하지만, 상황이 불분명 경우 그 명시 적 캐스트가 필요 할 수 있습니다 다음에 따라

// cast required 
System.out.println(((Predicate<Character>) Character::isUpperCase).test('A')); 

// no cast required 
Arrays.asList("foo","bar").forEach(System.out::println); 
Arrays.asList(1,2).forEach(i -> System.out.println(i*2)); 
+0

그냥 궁금해서 그 인스턴스의 반환을 한 줄로 반환 할 수 있습니까? –

+3

함수형 인터페이스에는 하나의 ** abstract ** 메소드 만 있다고 말하는 것이 낫다. 왜냐하면'default' 메소드뿐만 아니라'static' 메소드도 있기 때문에 다른 타입의 무관 한 메소드에주의를 기울이지 않는다. Java 9는'private' 메소드를 허용합니다. 이것은'인터페이스'가 기능 인터페이스인지 아닌지에 대한 질문과 무관합니다. 좀 더 정확하기 위해서'java.lang.Object'에 선언 된 메소드와 정확히 일치하지 않는 하나의 추상 메소드를 가지고 있기 때문에 두 개의 추상 메소드를 가진'Comparator'는 여전히 기능 인터페이스입니다. – Holger

+1

@fireflieslive : "한 줄에 그 인스턴스를 반환 할 수 있습니까?"라는 것이 명확하지 않습니다. – Holger

0

때때로 가능합니다. 예 :

List<T> list = ... 
Collections.sort(list, (t1, t2) -> compareOperation(t1,t2)); 

functional interface Comparator<T> 하나만 추상적 방법을 포함하는 인터페이스이다. See docs.oracle