Lambda 표현식

구름코딩·2020년 9월 30일
0

java8 _ 더 자바

목록 보기
4/23

기본 형태

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

인자 리스트

  • 인자가 없을 때 : ()
  • 인자가 한개 일 때 : i or (i)
  • 인자가 여러개 일 때 : (i, j)
  • 인자의 타입은 생략 가능, 컴파일러가 추론 / 명시도 가능

바디

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

변수캡쳐 Variable Capture

  • 로컬 변수 캡쳐
    • final이거나 effective final인 경우에만 참조할 수 있다
    • 그렇지 않은경우 concurrency(동시성) 문제가 생길 수 있다
  • effective final
    • 사실상 final인 변수에 해당한다
    • final키워드를 사용하지 않는 effective final변수를 익명클래스 구현체 또는 람다에서 참조할 수 있다
  • 쉐도잉 (scope개념)
    • 익명 클래스는 새로운 scope를 갖지만, 람다는 람다를 감싸고있는 scope를 공유한다

코드

	private static void run() {
        // 사실상 finald인 더이상 변경되지 않는 변수
        // effective final 일 경우에만 람다, 로컬클래스, 익명 내부 클래스에서 참조가 가능하다

        int basenumber = 10; // 변수

        // 로컬 클래스 : 쉐도잉 가능
        // 개별 scope를 갖는다
        class localClass {
            void printBaseNumber() {
                int basenumber = 11;
                System.out.println(basenumber);
            }
        }
        localClass local = new localClass();
        local.printBaseNumber();

        // 익명 내부 클래스 : 쉐도잉 가능 (외부 변수를 현재 스코프 내 변수가 덮는다)
        // 개별 scope를 갖는다
        Consumer<Integer> integerConsumer = new Consumer<Integer>() {
            @Override
            public void accept(Integer basenumber) {
                System.out.println(basenumber);
            }
        };
        integerConsumer.accept(10);

        // 람다 : 쉐도잉 불가능 (동일 변수 선언 불가능)
        // 현재 람다식이 존재하는 메서드와 scope가 동일하다
        IntConsumer printInt = (i) -> {
            //int basenumber;
            System.out.println(i + basenumber);
        };

        printInt.accept(10);
    }
profile
내꿈은 숲속의잠자는공주

0개의 댓글