Everyday Dev System

Steam() 활용하기 본문

내배캠 주요 학습/TIL : Today I Learned

Steam() 활용하기

chaeyoung- 2023. 7. 18. 15:51

 

 

1. 아래 코드를 간략화 할 수 있는가?

        List<Post> postList = postRepository.findAll();
        List<PostResponseDto> postResponseDtoList;
        postResponseDtoList = postList.stream()
                .map(post -> {
                        PostResponseDto responseDto = new PostResponseDto(post);
                        return responseDto;
                })
                .collect(Collectors.toList());

간략화한 결과 :

List<Post> postList = postRepository.findAll();
List<PostResponseDto> postResponseDtoList = postList.stream()
        .map(PostResponseDto::new)
        .toList());

위 코드에서 PostResponseDto::new는 Post 객체를 인자로 받는 PostResponseDto의 생성자를 참조하는 생성자 레퍼런스입니다. 이렇게 생성자 레퍼런스를 사용하면 불필요한 코드를 줄이고 가독성을 높일 수 있습니다. map() 메서드 안에서 PostResponseDto 객체를 생성하는 코드를 람다 표현식 대신 생성자 레퍼런스를 사용하여 더 간결하게 표현한 것입니다.

 

 

 

2. stream에서 .map() 과 .collect() 이해하기

List<Post> postList = postRepository.findAll();
List<PostResponseDto> postResponseDtoList = postList.stream()
        .map(PostResponseDto::new)
        .collect(Collectors.toList());

.collect(Collectors.toList())는 Stream의 요소들을 리스트로 수집하는 작업을 수행합니다. Stream API에서는 중간 연산과 최종 연산으로 구분됩니다. map()은 중간 연산에 해당하며, 각 요소를 변환하는 작업을 수행합니다. 그리고 .collect()는 최종 연산에 해당하며, 변환된 요소들을 최종적으로 수집하는 역할을 합니다.

Stream.map() 메서드로 Post 객체들을 PostResponseDto로 변환한 후에 .collect(Collectors.toList())를 사용하여 그 결과를 List로 수집합니다.

즉, 위 코드에서는 다음과 같은 순서로 작업이 이루어집니다:

postRepository.findAll()을 통해 데이터베이스나 다른 소스로부터 List<Post>를 가져옵니다.
Stream API의 .map() 메서드를 사용하여 각 Post 객체를 PostResponseDto로 변환합니다.
변환된 PostResponseDto 객체들을 .collect(Collectors.toList())를 사용하여 최종적으로 List<PostResponseDto>로 수집합니다.

따라서, .collect(Collectors.toList())는 Stream의 최종 연산으로, Stream에서 처리한 결과를 리스트로 변환해주는 역할을 합니다.

 

 

 

3. .collect(Collectors.toList());.toList()로 써도 똑같은 기능을 수행하는가?

List<Post> postList = postRepository.findAll();
List<PostResponseDto> postResponseDtoList = postList.stream()
        .map(PostResponseDto::new)
        .toList(); // Java 16 이상에서 사용 가능

네, 맞습니다. .collect(Collectors.toList())는 람다 표현식을 사용하여 Stream의 요소들을 리스트로 수집하는 작업을 수행하고, Java 16부터는 더 간결하게 .toList() 메서드를 사용할 수 있습니다.

Java 16 이상의 버전에서는 Stream 인터페이스에 toList() 메서드가 추가되어 리스트 수집을 더 간단하게 할 수 있습니다. 이를 사용하면 코드가 더 짧고 가독성이 좋아집니다. 기존에 사용하던 .collect(Collectors.toList()) 대신 .toList()를 사용하면 아래와 같이 코드를 작성할 수 있습니다.

 

따라서 .toList()를 사용하여 똑같은 기능을 수행할 수 있으며, 코드가 더 간결해집니다. .toList()는 Java 16 이상에서만 사용할 수 있으므로 Java 8 또는 Java 11, 14 등의 버전에서는 .collect(Collectors.toList())를 사용해야 합니다.

'내배캠 주요 학습 > TIL : Today I Learned' 카테고리의 다른 글

@ExceptionHandler 사용법  (0) 2023.07.25
7월 25일 TIL  (0) 2023.07.25
후발대 강의  (0) 2023.07.17
Spring Security  (0) 2023.07.07
협업을 할 때에 궁금한 사항들 및 유의사항  (0) 2023.07.04