티스토리 뷰

Language/Java

[JAVA8] 람다 표현식

JayStevency 2017. 1. 18. 19:16

03 : 함수형 인터페이스

함수형 인터페이스(Functional Interface) 

람다 표현식은 단일 추상 메서드를 갖춘 인터페이스 객체에 사용 가능 하다. 이러한 인터페이스를 함수형 인터페이스(Functional Interface)라 한다.

Arrays.sort 메서드를 고려해 보면 두 번째 파라미터는 단일 메서드를 갖춘 인터페이스인 Comparator의 인스턴스를 필요로 한다.

기존의 구현 방식은 다음과 같다.

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<StringString, 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 메서드는 예외를 던질수 없기 때문에 위의 대입은 잘못된 것이다. 이를 수정하기 위해선 

첫째로 먼저 람다 표현식의 몸체에서 예외를 잡는다. 

두번째 해당 예외를 던질 수 있는 단일 추상 메서드를 갖춘 인터페이스에 람다를 대입한다.


<소스코드>

https://github.com/JayStevency/Java8/blob/master/src/com/java8/functionlinterface/FunctionalTest.java




'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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함