Go together

If you want to go fast, go alone. If you want to go far, go together.

JAVA

JAVA Stream map

NowChan 2022. 3. 16. 11:25

결론

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 영역)에 생성하고 참조값을 리턴하는 역할을 합니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;blogId=heartflow89&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;logNo=220955262405

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