-
서론
람다가 무엇인지 람다는 어떤 조건에 사용할 수 있는지 등을 설명하는 챕터이다.
람다란?
람다란 (파라미터) -> {바디} 로 구현되어있으며, 메서드를 전달할 수 있는 익명 함수를 단순화한 것
어디에 람다를 사용하는지?
1. 함수형 인터페이스
-
함수형 인터페이스를 인수로 받는 메서드에만 람다 표현식을 사용할 수 있는지는 추후 20, 21 챕터에 설명예정
-
함수 디스크립터 : 함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식의 시그니처를 가리킨다. 람다 표현식의 시그니처를 서술하는 메서드를 함수 디스크립터라고 부른다.
실행 어라운드 패턴
-
자원 처리에 사용하는 순환 패턴은 자원을 열고, 처리한 다음에, 자원을 닫는 순서로 이루어진다. 설정과 정리 과정 은 대부분 비슷하다. 즉 실제 자원을 처리하는 코드를 설정과 정리 두 과정이 둘러싸는 형태를 갖는다. 아래의 그림처럼 이루어진걸 실행 어라운드 패턴이라 부른다. (try-with-resources)
함수형 인터페이스
-
하나의 추상 메서드만 존재하는 인터페이스이다. ex) Predicate의 test 메서드, Runnable의 run 메서드
-
함수형 인터페이스를 지정하는 어노테이션으로 @FunctionalInterface 가 존재한다. 단 어노테이션 사용한 인터페이스가 함수형 인터페이스가 아닌경우 컴파일 시 에러가 발생한다.
박싱, 언박싱
기본형을 참조형으로 변환하는게 박싱
참조형을 기본형으로 변환하는걸 언박싱 이라한다.
형식 검사, 형식 추론, 제약
람다 표현식 자체에는 어떤 정보가 포함되어있는지 알 수 없으므로 람다의 실제 형식을 파악하고 있어야 한다.
-
람다가 사용돠는 콘텍스트를 이용해서 람다의 형식을 추론할 수 있다. (ex)람다가 전달될 메서드 파라미터나 람다가 할당되는 변수 등)어떤 콘텍스트에서 기대되는 람다 표현식의 형식을 대상 형식이라고 부른다. (Predicate, Runnable)
-
람다 표현식이 사용된 콘텍스트(대상 형식)를 이용해서 람다 표현식과 관련된 함수형 인터페이스를 추론한다. 즉 대상 형식을 이용해서 함수 디스크립터를 알 수 있으므로 컴파일러는 람다의 시그니처도 추론할 수 있다. 결과적으로 컴파일러는 람다 표현식의 파라미터 형식에 접근할 수 있으므로 람다 문법에서 이를 생략할 수 있다. ( 자바 컴파일러가 형식으로 추론하여 타입을 명시적으로 표현하지 않아도 된다.)
-
지역변수 사용과 제약
-
명시적으로 상수(final)로 선언되있거나 실질적 final처럼 사용되는 변수만 사용할 수 있다.
-
지역변수는
-
지금까지 살펴본 람다 표현식은 인수를 자신의 바디 안에서만 사용했다. 하지만 람다 표현식에서 익명 함수가 하는 것처럼 자유변수(파라미터로 넘겨진 변수가 아닌 외부에서 정의 된 변수)를 활용할 수 있다.
이걸 람다 캡처링 이라고 부른다
람다같은 경우 아래와 같은방법으로도 사용이가능하다
(List<String> list) -> list.isEmpty() // boolean 사용 () ->new Apple(10) // 이런식으로 객체 생성도 가능하다. (Apple a) -> System.out.println(a.getWeight()) // 객체에서 소비 (String s) -> s.length() // 객체에서 선택/추출
// 람다 캡처링 예제 Integer portNum = 8080; Runnable runnable = () -> System.out.println(portNum); // 여기서 들어가는 포트번호는 final로 선언이 되거나 // final 처럼 한번만 선언된 경우만 넣고 사용 할 수 있다.
그나마 git : github.com/hodolee246/ModernJavaStudygithub.com/hodolee246/ModernJavaStudy/blob/master/src/main/java/com/example/modernjava/ch2/ExamPredicate.javagithub.com/hodolee246/ModernJavaStudy/blob/master/src/main/java/com/example/modernjava/ch3/lamdaExcam.java
'모던자바인액션' 카테고리의 다른 글
챕터[7] 스트림 병렬화 (0) 2020.10.21 챕터[6] 스트림 그룹화 (0) 2020.10.21 챕터[5] 스트림 데이터 수집 (0) 2020.10.21 챕터[4] 스트림 (0) 2020.10.21 챕터[2] 동작 파라미터화 (0) 2020.10.21 -