본문 바로가기
IT 학습/Java

[자바 Java] 람다 표현식(Lambda Expression)

by A.S.L 2022. 12. 9.

정의

  • 한 번 이상 실행할 수 있는 코드 블록 { } 이라고 하는데... 일단 샘플을 봐보자.
@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

//기존 선언 방식
Runnable task = new Runnable() {
      @Override
      public void run() {

      }
};

//람다 표현식을 사용해한 선언 방법
Runnable task = () -> doSomething(); //식이 간단한 경우
Runnable task = () -> { do1(); do2(); } //식이 복잡한 경우 괄호 { }를 통해서 작성

위 코드에서 Runnable처럼 추상 메서드가 한 개만 있는 인터페이스를 함수형 인터페이스라고 하는데

 

람다 표현식을 통해 함수형 인터페이스(Funtional Interface)구현을 대체할 수 있다.

 

Runnable의 run메소드 처럼 파라미터와 return값이 없는 간단한 함수 뿐만 아니라 파라미터가 있거나 return값이 있는 함수들도 표현이 가능하다.

 

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    //Comparator인터페이스의 일부 코드
}

//파라미터의 티입을 명시하는 경우
Comparator<String> stringComparator = (String s1, String s2) -> {
  s1.length();
  s2.length();
  return 1;
};

//파라미터의 티입을 생략하는 경우
Comparator<String> stringComparator = (s1, s2) -> {
  s1.length();
  s2.length();
  return 1;
};

 

Comparator 인터페이스는 하나의 추상 메소드인 Compare(...)를 가지고 있기 때문에

위 코드처럼 람다 표현식으로 대체가 가능하다.

 

함수형 인터페이스는 추상 메소드가 하나이고

람다 표현식으로 작성되는 이 함수의 구현에서는 파라미터의 타입이 짐작이 가능하다.

그래서 람다 표현식을 작성하는 경우 아래쪽 코드처럼 s1, s2의 타입을 생략하는 것도 가능하다.

 

만약 파라미터가 한개라면 괄호 '( )'도 생략이 가능하다.