Coding/Study

[JAVA] 람다식 Lambda

mimi 2023. 10. 5. 14:49
728x90
반응형

람다식

- 익명 함수(anonymout function)를 생성하기 위한 식

- 객체 지향 언어보다는 함수 지향 언어에 가깝다.

- 자바 코드가 간결해진다.

- 컬렉션의 요솔르 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다.

- (매개변수) -> { 실행코드 } 형태로 작성

 

람다식 -> 매개 변수를 가진 코드 블록 -> 익명 구현 객체

// Runnable 인터페이스 익명 구현 객체 생성하는 전형적인 코드
Runnable runnable = new Runnable() {
    public void run() { ... }
}

// 익명 구현 객체를 람다식으로 표현
Runnable runnable = () -> { ... };

 

 

타겟 타입과 함수적 인터페이스(@FunctionalInterface)

- 람다식의 타겟 타입은 하나의 추상 메소드가 선언된 인터페이스(두 개 이상 선언된 것은 타겟 타입 사용 불가)

- @FunctionalInterface 어노테이션을 인터페이스 선언 시 붙여주면

  두 개 이상의 추상 메소드가 선언되면 컴파일러가 체킹해 오류를 발생해준다. (선택사항)

@FunctionalInterface
public interface MyFunctionalInterface {
    public void method();
    public void otherMethod();	// 컴파일 오류
}

 

 

정적 메소드와 인스턴스 메소드 참조

- 정적(static) 메소드를 참조할 경우 클래스 이름 뒤에 :: 기호를 붙이고 정적 메소드 이름을 기술

public class Main {
    public static int staticMethod(int x, int y) {	// 정적 메소드
        return x + y;
    }

    public int insatanceMethod(int x, int y) {	// 인스턴스 메소드
        return x + y;
    }

    public static void main(String[] args) {
        IntBinaryOperator oper;

	    // 정적 메소드 참조
        oper = (x, y) -> Main.staticMethod(x, y);
        System.out.println("결과1 : " + oper.applyAsInt(1, 2));

        oper = Main::staticMethod;
        System.out.println("결과2 : " + oper.applyAsInt(3, 4));

	    /// 인스턴스 메소드 참조
        Main obj = new Main();
        oper = (x, y) -> obj.insatanceMethod(x, y);
        System.out.println("결과3 : " + oper.applyAsInt(5, 6));

        oper = obj :: insatanceMethod;
        System.out.println("결과4 : " + oper.applyAsInt(7, 8));
    }
}

 

728x90
반응형