[Java] 람다식(Lambda Expression)

람다식(Lambda Expression)

  • 함수를 간단한 '식(expression)'으로 표한하는 방법
  • 익명함수(이름이 없는 함수, anonymous function)
  • 람다식은 익명함수가 아니라 익명 객체 이다.

예시

//Object obj = (a, b) -> a > b ? a: b; //람다식. 익명객체

Object obj = new Object() {
            int max(int a, int b){
                return a > b ? a : b;
            }
        };

위의 두 가지 코드는 같은 방식이다.

함수와 메서드의 차이

  • 근본적으로는 동일. 함수는 일반적인 용어, 메서드는 객체지향개념 용어
  • 함수는 클래스에 독립적, 메서드는 클래스에 종속적

 

함수형 인터페이스

  • 함수형 인터페이스 : 단 하나의 추상 메서드만 선언된 인터페이스
    @FunctionalInterface
    interface MyFunction {
     public abstract int max(int a, int b);
    }

함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있다.

(단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 한다.)

MyFunction f = (a,b) -> a > b ? a : b;  //람다식
int value = f.max(3,5); // 실제로는 람다식(익명 함수)이 호출됨

예제

public class ex14 {

    public static void main(String[] args) {

        MyFunction2 f = new MyFunction2() {
            @Override
            public int max(int a, int b) {
                return a > b ? a : b;
            }
        };

        int value = f.max(3,5);
        System.out.println("value : " + value);  // value : 5

        // 위의 소스들을 람다식으로 간단하게 표현할 수 있다.
        MyFunction2 dd = (a,b) -> a > b ? a : b; // 람다식. 익명객체
        int value2 = dd.max(10,20); //함수형 인터페이스
        System.out.println("value2 : " + value2); // value2 : 20
    }
}

@FunctionalInterface // 함수형 인터페이스라는것을 명시
interface MyFunction2 {
    int max(int a, int b);
}

 

함수형 인터페이스 예제

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ex01 {

    public static void main(String[] args) {

        //List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
        List<Integer> list = Arrays.asList(10, 15, 5, 60, 100);

        Collections.sort(list, (s1, s2) -> s2.compareTo(s1)); // 내림차순
        System.out.println(list); // [100, 60, 15, 10, 5]

        Collections.sort(list, (s2, s1) -> s2.compareTo(s1)); // 오름차순
        System.out.println(list); // [5, 10, 15, 60, 100]

    }
}

Designed by JB FACTORY