티스토리 뷰
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 함수를 사용하면 두 번 중복해서 사용되던 댓글 조회와 에러 처리 부분을 한 번만 사용하여 중복 코드를 제거할 수 있다.
'language > java' 카테고리의 다른 글
일급 컬렉션을 사용하는 이유 (불변 객체, 방어적 복사) (1) | 2024.11.13 |
---|---|
annotation processor란 (+ kotlin의 kapt) (0) | 2023.09.04 |
정적 팩토리 메서드 (Static Factory Method) 사용하기 (2) | 2023.04.05 |
인터페이스란? 추상클래스와 인터페이스의 차이점은? (0) | 2021.07.23 |
추상 클래스란? (0) | 2021.07.22 |
- Total
- Today
- Yesterday
- 오블완
- 스프링오류
- addFilterBefore
- Java
- Kotlin
- MultipleBagFetchException
- checkout
- MongoDB
- FetchJoin
- port
- array
- QueryDSL
- 자바 어플리케이션 실행 과정
- Cannot construct instance of
- 티스토리챌린지
- redisson 분산락
- 추상클래스
- Git
- n+1
- Spring Security
- Linux
- ChatGPT
- junit5
- 배열
- jvm warm-up 전략
- bucket4j
- dto 클래스 생성자
- 스프링 스케줄링
- spring boot 3
- JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |