본문 바로가기

Development/Java

자바8. 람다 표현식에 대하여.

JAVA8 의 람다 표현식



메소드로 전달할 수 있는 익명함수를 단순화 한 것이라고 보면 된다.

익명함수의 성질을 동일하게 가지지만 표현이 훨씬 더 간단하며, 메소드 파라미터로 전달하거나 변수로 저장할 수 있다.


다시 설명하면, 함수형 인터페이스추상 메소드의 구현체를 간단하게 표현하는 것이라고 생각하면 된다.



함수형 인터페이스



정확히 하나의 추상메소드를 지정하는 인터페이스이다.

JAVA 8로 넘어 오면서 @FunctionalInterface 애노테이션이 추가되었는데, 이 함수형 인터페이스를 지칭할 때 사용한다.


함수형 인터페이스가 아닌 ( = 추상메소드가 2개 이상인) 인터페이스 사용하면 컴파일 에러가 발생한다.


단, default 메소드는 제외한다.


1
2
3
4
@FunctionalInterface
public interface SimpleTestService {
    boolean test(Object object);
}
cs


1
2
3
4
5
6
7
8
@FunctionalInterface
public interface SimpleTestService {
    boolean test(Object object);
 
    default boolean test2(){
        return false;
    }
}
cs


단, 다음과 같은 케이스는 컴파일에러 발생.


1
2
3
4
5
6
7
8
//Compile Error ! : Multiple non-overriding abstract methods found .. 
 
@FunctionalInterface
public interface SimpleTestService {
    boolean test(Object object);
    
    boolean test2();
}
cs




람다 표현식 구성



파라미터 + 화살표 + 바디 (Expression, Statements.. 등)


(String s) -> s.isEmpty();



람다 표현식은 함수형 인터페이스 추상 메소드 동일한 메소드 시그니쳐를 가진다




람다 표현식 사용 예



1
2
3
4
5
6
7
8
9
10
// 기존 Predicate 구현 방식
Predicate<String> stringFilter = new Predicate<String>() {
    @Override
    public boolean test(String s) {
        return s.isEmpty();
    }
};
 
// 람다를 이용한 Predicate 구현
Predicate<String> stringFilterByLamda = (String s) -> s.isEmpty();
cs





참고 : Java 8 In Action