티스토리 뷰
03 : 함수형 인터페이스
함수형 인터페이스(Functional Interface)
1 2 3 4 5 6 7 | class ComparatorTest implements Comparator<String>{ public int compare(String first , String second){ return Integer.compare(first.length(), second.length()); } } Arrays.sort(words, new ComparatorTest()); |
1 2 | Arrays.sort(words, (first, second) -> Integer.compare(first.length(), second.length())); |
얼마나 간결 한가. 여기서 Comparator 인터페이스는 compare 메서드 하나만 포함된 함수형 인터페이스 이다 .
<참고 :
https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
책에선 함수형 인터페이스로 변환이 자바에서 람다 표현식을 이용해 할 수 있는 유일한 일이라 설명한다. 함수 리터럴을 지원하는 다른 프로그래밍 언어에서와 달리 자바 설계자들이 언어에 함수 타입을 추가하는 대신 인터페이스라는 친숙한 개념을 고수하기로 했단다.
java.util.function와 @FunctionalInterface
자바 API는 java.util.function 패키지에 다수의 아주 범용적인 함수형 인터페이스를 정의하고 있다. 이러한 인터페이스 중 하나인 BiFunction<T, U, R>은 파라미터 타입이 T와 U이고, 리턴 타입이 R인 함수이다. 문자열 비교 람다를 BiFunction 타입 변수에 저장 할 수 있다.
1 2 | BiFunction<String, String, Integer> comp = (first, second) -> Integer.compare(first.length(), second.length()); |
뭐 이건 근데 Arrays.sort 메서드가 없기 때문에 쓸모 없다고 한다. BiFunction 에 대한 정보는
<참고 : https://docs.oracle.com/javase/8/docs/api/java/util/function/BiFunction.html
여길 보면 알 수 있다.
Note : 함수형 인터페이스에 @FunctionalInterface 애너테이션을 붙일수 있다. 그러면
첫째, 컴파일러에서 애너테이션이 붙은 엔티티가 단일 추상 메서드를 갖춘 인터페이스인지 검사한다.
둘째, javadoc 페이지에서 해당 인터페이스가 함수형 인터페이스임을 알리는 문장을 포함한다.
이 애너테이션을 반드시 사용하라는 것은 아니지만 정의에 따르면,
단일 추상 메서드를 갖춘 모든 인터페이스는 함수형 인터페이스라 정의 한다고 한다. 그럼 뭐 사용하는게 좋을 거같다.
Checked Exception
1 2 3 | Runnable sleeper = () -> { System.out.println("Zzz"); Thread.sleep(1000); }; //오류 : Thread.sleep은 겸사 예외인 InterruptedException을 던질 수 있다. |
Runnable.run 메서드는 예외를 던질수 없기 때문에 위의 대입은 잘못된 것이다. 이를 수정하기 위해선
첫째로 먼저 람다 표현식의 몸체에서 예외를 잡는다.
두번째 해당 예외를 던질 수 있는 단일 추상 메서드를 갖춘 인터페이스에 람다를 대입한다.
<소스코드>
'Language > Java' 카테고리의 다른 글
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
---|---|
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |