결론
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
// 같은 표현
List<TodoDTO> dtos = entities.stream().map(entity -> new TodoDTO(entity)).collect ...
java stream은 배열 또는 컬렉션 인스턴스에 람다 함수를 적용할 수 있는 기술입니다.
배열 스트림
Arrays.stream 메서드를 사용
String[] arr = new string[]{"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr, 1, 3); // [b, c] 반환
컬렉션 스트림 : 컬렉션 타입(Collection, List, Set)
Collection 타입이 interface하는 메서드(.stream)로 스트림을 만들 수 있음
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
Mapping
stream에 들어 있는 값(input)이 특정 로직을 거쳐 반환된 값(output)이 새로운 스트림에 담기게 됩니다.
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
T는 Stream에 있는 원소 타입이다. R은 담을 변수로 설정한 타입이다.
List<Number> memberNameList = Arrays.asList(1, 2, 3);
String collect = memberNameList.stream().map(Object::toString).collect(Collectors.joining());
String이 R이고, Number가 T이다.
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
entities는 List<TodoEntity> 타입이다. TodoDTO는 TodoEntity를 상속하거나 받지 않는다.
TodoDTO::new는 생성자 참조로 인스턴스를 생성하지 않고 생성자 메소드를 참조하는 것 뿐입니다. TodoDTO의 생성자 메서드는 아래와 같다. (추가 자료)
public TodoDTO(final TodoEntity entity){
this.id = entity.getId();
this.title = entity.getTitle();
this.done = entity.isDone();
}
::은 메소드 참조 표현식(method reference expression)이며, 람다 표현식이다.
// 일반 람다식
(인스턴스 -> 인스턴스.메서드())
// 메서드 참조 표현식
(인스턴스의 클래스명::메서드명)
new 연산자는 클래스 타입의 인스턴스를 메모리(Heap 영역)에 생성하고 참조값을 리턴하는 역할을 합니다.

TodoDTO dto = new TodoDTO();
궁금한 점
map 함수 원형에서 제네릭 R이 어떻게 정해지는지 논리적으로 이해하기
출처:
http://yoonbumtae.com/?p=2776
https://futurecreator.github.io/2018/08/26/java-8-streams/
'JAVA' 카테고리의 다른 글
Java 언어 특징 (0) | 2022.04.09 |
---|---|
JAVA 제네릭 정리 (0) | 2022.03.13 |