티스토리 뷰

language/java

Java 8 Stream : map 함수

daeuun 2023. 4. 18. 19:10

stream 의 map

map 함수는 Java의 Stream API에서 제공하는 메소드,
stream의 각 요소에 주어진 함수를 적용한 후 결과를 새로운 stream으로 반환한다.


기존에 있던 댓글을 가져와서 새로운 댓글로 업데이트 하는 과정을 의식의 흐름대로 작성해보니 이러했다.

@Transactional
public Comment update(Long commentId, CommentDto request) {

    // 변경하기전 댓글 객체 조회
    Comment original = commentRepository.findById(commentId)
            .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_DOES_NOT_EXISTS));

    Comment commentToUpdate = original.update(request);
    commentRepository.save(commentToUpdate);

    // 변경 후 댓글 객체 조회
    Comment newComment = commentRepository.findById(commentId)
            .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_DOES_NOT_EXISTS));

    return newComment;
}

기존에 있던 객체를 업데이트 하기 위해서
1. 기존에 존재하던 값의 객체 생성 
2. 새로운 값으로 업데이트할 객체 생성
이렇게 두번 객체를 생성해서 최종 업데이트 된 값을 반환했다.

동일한 코드가 반복되는데 이것을 stream의 map 메서드를 이용해서 중복을 없애보았다.

 

 

아래는 map 함수를 이용해서 새로운 객체로 변환하는 코드이다.

@Transactional
public Comment update(Long commentId, CommentDto request) {

    // 댓글 조회해서 있는 경우 update + save
    Comment updatedComment = commentRepository.findById(commentId)
            .map(original -> {
                Comment commentToUpdate = original.update(request);
                return commentRepository.save(commentToUpdate);
            })
            .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_DOES_NOT_EXISTS));
            
    return updatedComment;
}

1. commentRepository.findById(commentId) 로 주어진 commentId에 해당하는 댓글을 조회한다.

 

findById 메소드는 Optional<Comment>를 반환하는데,

Optional은 값이 존재할 수도, 존재하지 않을 수도 있는 컨테이너 객체다.

 

.map(original -> {
    Comment commentToUpdate = original.update(request);
    return commentRepository.save(commentToUpdate);
})


2. 반환된 Optional<Comment> 객체에 map 함수를 호출한다.

map 함수는 Comment 객체가 존재하면 주어진 람다 함수를 적용하고, 그 결과를 새로운 Optional 객체로 반환한다.

 람다 함수에서 원래의 댓글 객체를 업데이트하고 저장한 후에 반환한다.

 


3. 마지막으로, orElseThrow 메소드를 호출해서

댓글이 존재하지 않으면 ErrorCode.COMMENT_DOES_NOT_EXISTS 에러가 발생하고, 댓글이 존재하면 업데이트된 댓글 객체를 반환한다.

 


이렇게 map 함수를 사용하면 두 번 중복해서 사용되던 댓글 조회와 에러 처리 부분을 한 번만 사용하여 중복 코드를 제거할 수 있다. 

 

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함