java .map 자동 추론

sun·3일 전

2026

목록 보기
5/6
//Controller.java
drService.findAll()
    .stream()
    .map(d -> new DrResponse(d.getId(), d.getName()))
    .toList();

java 자동 추론.

dDr인 건 stream() 앞에서 이미 타입이 정해져 있어서,
자바가 자동으로 추론하기 때문이다.

//Service.java
List<Dr> list = drinkService.findAll();
  • findAll()의 반환 타입은 -> List<Dr>

.stream()의 의미

list.stream()

이걸 타입으로 쓰면 :

Stream<Dr>

즉, 이 스트림은 Dr 만 흘러다닌다.


그래서 map의 입력 타입은 이미 결정됨

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-each랑 비교하면 더 이해됨.

for (Dr d : dr) {
    System.out.println(d.getName());
}

여기서도 d는 :

  • 앞에 Dr가 있어서 아는 게 아니라
  • drList<Dr>이라서 아는 거야.

= 스트림도 똑같다.


한 문장 정리 :

d는 선언이 안 된 게 아니라,
스트림의 타입(Stream<Dr>)으로부터
자동 추론된 매개변수이다.

0개의 댓글