Programming/Java

[Java] - 4. 람다 표현식

rw- 2023. 4. 1. 17:20
728x90

4. 람다 표현식

람다

  • (인자 리스트) -> {바디}

인자 리스트

  • 인자가 없을 때: ()
  • 인자가 한개일 때: (one) 또는 one
  • 인자가 여러개 일 때: (one, two)
  • 인자의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two)

바디

  • 화살표 오른쪽에 함수 본문을 정의한다.
  • 여러 줄인 경우에 {}를 사용해서 묶는다.
  • 한 줄인 경우에 생략 가능, reutrn도 생략 가능.

변수 캡처 (Variable Capture)

  • 로컬 변수 캡처
    • final이거나 effective final인 경우에만 참조할 수 있다.
    • 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일러가 방지한다.
  • effective final
    • 이것도 역시 자바 8부터 지원하는 기능으로 "사실상" final인 변수.
    • final 키워드 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.
  • 익명 클래스 구현체와 달리 "쉐도윙"하지 않는다.
    • 익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥 같다.
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;

public class FooLambda {

  public static void main(String[] args) {
    Supplier<Integer> get10 = () -> 10;
    BinaryOperator<Integer> sum = (a, b) -> a + b;
    System.out.println(sum.apply(10, 20));

    UnaryOperator<Integer> plus10 = (i) -> i + 10;
    UnaryOperator<Integer> multiply2 = (i) -> i * 10;
    System.out.println(plus10.andThen(multiply2).apply(2));

    FooLambda FooLambda = new FooLambda();
    FooLambda.run();
  }

  private void run() {
    int baseNumber = 10;

    // 로컬 클래스
    class LocalClass {
      void printBaseNumber() {
        int baseNumber = 11;
        System.out.println("printBaseNumber(): " + baseNumber);
      }
    }

    // 익명 클래스
    Consumer<Integer> integerConsumer = new Consumer<Integer>() {
      @Override
      public void accept(Integer baseNumber) {
        System.out.println("integerConsumer: " + baseNumber);
      }
    };

    // 람다
    IntConsumer printInt = (i) -> {
      System.out.println("printInt: " + i + baseNumber);
    };

    printInt.accept(10);
    integerConsumer.accept(10);
    LocalClass localClass = new LocalClass();
    localClass.printBaseNumber();
  }
}
30
120
printInt: 1010
integerConsumer: 10
printBaseNumber(): 11

참고

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html#shadowing
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

728x90
반응형