//Controller.java
drService.findAll()
.stream()
.map(d -> new DrResponse(d.getId(), d.getName()))
.toList();
d가 Dr인 건 stream() 앞에서 이미 타입이 정해져 있어서,
자바가 자동으로 추론하기 때문이다.
//Service.java
List<Dr> list = drinkService.findAll();
findAll()의 반환 타입은 -> List<Dr>list.stream()
이걸 타입으로 쓰면 :
Stream<Dr>
즉, 이 스트림은 Dr 만 흘러다닌다.
map 의 정의를 보면 (개념적으로) :
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
여기서 중요한 건 :
T = 스트림이 가진 타입Stream<Dr>map( Dr -> ??? )
이 구조가 이미 고정되어 있다.
그래서 이 람다는 사실 이렇게 생긴 거다.
.map(d -> new DrResponse(d.getId(), d.getName()))
자바가 내부적으로 이해하는 형태는 아래에서 확인.
.map((Drink d) -> new DrResponse(d.getId(), d.getName()))
선언을 안 했는데 어떻게 알지?가 궁금했는데 정체는 ㅋㅋ
타입 추론 (Type Inference)
자바의 기능 이름이 있다.
자바가 이런 정보를 이미 알고 있기 때문이다.
stream() -> Stream<Dr>map() -> Dr 하나씩 받음그래서 d 를 보면 자바는 속으로 :
" 아, 이건 Dr이구나. "
for (Dr d : dr) {
System.out.println(d.getName());
}
여기서도 d는 :
dr이 List<Dr>이라서 아는 거야.= 스트림도 똑같다.
d는 선언이 안 된 게 아니라,
스트림의 타입(Stream<Dr>)으로부터
자동 추론된 매개변수이다.