람다 표현식

이승민·2022년 10월 18일

JAVA8

목록 보기
10/18

람다

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

인자 리스트

  • 인자가 없을 때: ()
  • 인자가 한 개일 떄: (one) 또는 one
  • 인자가 여러개 일 때: (one, two)
  • 인자의 타입은 생략 가능, 컴파일러가 추론하지만 명시할 수도 있다. -> 타입이 변수 선언부에 이미 정의되어 있기 때문에
    example: (Integer one, Integer two)

바디

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

변수 캡처(Variable Capture)

public class VariableCaptureExample{
	
    public static void main(String[] args){
    	VariableCaptureExample variableCaptureExample = new VariableCaptureExample();
     	variableCaptureExample.run();
     }
     
     private void run(){
     	final int baseNumber = 10;
        
        //로컬 클래스
        class LocalClass {
        	void printBaseNumber() {
            	System.out.println(baseNumber);
             }
        }
        
        //익명 클래스
        Consumer<Integer> integerConsumer = new Consumer<Integer>() {
        	@Override
            public void accept(Integer integer) {
            	System.out.println(baseNumber):
            }
        };
        
        //람다
        IntConsumer printInt = (i) -> {
        	System.out.println(i + baseNumber);
         };
         
         printInt.accept(10);
     }
 }
  • 로컬 변수 캡처
    • final이거나 effective final인 경우에만 참조할 수 있다.
    • 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일러가 방지한다.
  • effective final -> 사실상 final이다. 변수 선언 이후 변수 값을 변경하지 않는 경우
    • 이것도 역시 자바 8부터 지원하는 기능으로 "사실상" final 변수
    • final 키워드를 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.
  • 익명 클래스 구현체와 달리 "쉐도윙"하지 않는다.
    • 익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥과 같다.
profile
💻 끊임없이 성장하는 백엔드 개발자 💻

0개의 댓글