Post

람다식

람다

람다는 함수를 간단한 식으로 표현한 방법으로, 함수의 이름을 쓰지않고 매개변수와 구현부로만 구성되어있어 익명함수이다.

1
2
3
4
5
int min(int a, int b){
    return a < b ? a : b
} //함수

(int a, int b) -> a < b ? a : b //람다식

람다식 작성법

1
2
3
4
int onePlus(int i){
    i++;
    return i;
}
  1. 함수의 이름과 반환타입을 없앤다.
    1
    2
    3
    4
    
    (int i){
     i++;
     return i;
    }
    
  2. 매개변수와 { 사이에 -> 를 적는다.
    1
    2
    3
    4
    
    (int i) -> {
     i++;
     return i;
    }
    
  3. 매개변수나 반환값의 타입을 안다면 생략가능
    • 매개변수가 1개일 경우 ( )와 매개변수 형식 생략 가능
      1
      2
      3
      4
      
       i -> {
        i++;
        return i;
       }
      
    • 구현부의 문장이 하나일 경우 { } 생략 가능
      1
      
       i -> i++
      
    • 그러나 그 문장이 return.문 일경우 { }, ; 생략 불가능
      1
      
       i -> {return i++;}
      

위에서 람다식은 익명 함수라고 했지만 사실은 익명 객체이다. 이러한 람다식을 다루기 위해서는 참조변수가 필요하다.
익명 클래스를 다뤘던 것처럼 객체의 최고조상인 Object를 사용하면 어떨까?

Object클래스에는 내가 구현하고자 하는 메소드가 없기 때문에 참조변수로 사용할 수 없다. 이를 해결하기 위해서 함수형 인터페이스를 사용한다.

함수형 인터페이스

함수형 인터페이스는 추상메소드가 하나만 있는 인터페이스로, 애노테이션으로는 @FunctionalInterface를 적어준다.

java.util.function패키지에는 다양한 함수형 인터페이스를 제공한다.

  • Supplier<T> / T get();

입력값 X, 반환값 O

Alt text


  • Consumer<T> / void accept(T t);

입력값 O, 반환값 X

Alt text


  • Funtion<R,T> / T apply(R r);

입력값 O, 반환값 O

Alt text


  • Predicate<T> / Boolean test(T t);

입력값 O, 반환값 O(True / False)

Alt text


그밖에도 매개변수가 2개인 함수형 인터페이스

  • BiConsumer<T,U> / void accept(T t, U u);
  • BiPredicate<T,U> / Boolean test(T t, U u);
  • BiFunction<T,U,R> / R apply(T t, U u);

매개변수 타입과 반환타입이 같은 함수형 인터페이스

  • UnaryOperator / T apply(T t);
  • BinaryOperator / T apply(T t, T t);

등이 있다.

메소드 참조

람다식이 하나의 메소드일 경우 메소드 참조로 나타낸다.

  1. static 메소드 참조
    클래스이름::메소드 이름;
  2. 인스턴스 메소드 참조
    클래스 이름::메소드 이름;
  3. 특정 객체 메소드 참조
    참조변수 이름::메소드 이름;
  4. new 연산자
    클래스 이름::new;
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.