Language/Java

함수형 인터페이스와 람다 표현식

JUNGKEUNG 2022. 6. 18. 17:35
반응형

람다 

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

                                        //  인자 -> 바디
        Function<Integer, Integer> plus10 = (i) -> i + 10;

 

 

인자 리스트

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

 

 

바디

  • 화상표 오른쪽에 함수 본문을 정의한다.
  • 여러 줄인 경우에 {}를 사용해서 묶는다
  • 함 줄인 경우에 생략 가능, return도 생략 가능
import java.util.function.BinaryOperator;
import java.util.function.Supplier;

public class Foo {
    public static void main(String[] args) {
        //인자가 없을때인 경우, 만약 바디가 한줄이면 {} 제거해줘도 된다.
        Supplier<Integer> get10 = () -> 10;

        //인자의 값이 2개인 경우
        BinaryOperator<Integer> sum = (a, b) -> a + b;
    }
}

 

변수 캡쳐 (Variable Capture)

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

public class Foo {
    public static void main(String[] args) {

        Foo foo = new Foo();
        foo.run();
    }

    private void run() {
        // 익명, 로컬, 람다의 공통점은 final int baseNumber = 10; 참조 할수 있다.
        final int baseNumber = 10;

        // 익명 Class
        Consumer<Integer> integerConsumer = new Consumer<Integer> () {
            @Override
            public void accept(Integer integer) {
                System.out.println (baseNumber);
            }
        };

        //Local Class
        class LocalClass{
            void printBaseNumber() {
                System.out.println (baseNumber);
            }
        }

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

 

 

 

참고


백기선 - 더 자바, Java8
https://www.inflearn.com/course/the-java-java8/dashboard