jpa를 사용하다가
entity에 dto를 적용할 때가 있었다.
entity를 dto로 변환하는 과정에서 stream, map, collect를 사용하였다.
동작원리를 알아보자.
코드는 AppointmentQueryService 클래스에서 findAppointmentByEmail() 메서드를 살펴보겠다.
findAppointmentByEmail() 메서드: 해당 email 멤버에 대한 예약 내역을 가져오는 메서드
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AppointmentQueryService {
private final AppointmentRepository appointmentRepository;
private final MemberRepository memberRepository;
private final DoctorRepository doctorRepository;
public List<AppointmentDto> findAppointmentByEmail(String email) {
Member member = findMember(email);
List<Appointment> appointments = appointmentRepository.findByMemberId(member.getId());
List<AppointmentDto> appointmentDtos = appointments
.stream()
.map(o -> new AppointmentDto(o))
.collect(Collectors.toList());
return appointmentDtos;
}
우리는 stream, map, collect 사용부분에서
stream()을 보려고 한다.
List<AppointmentDto> appointmentDtos = appointments
.stream()
.map(o -> new AppointmentDto(o))
.collect(Collectors.toList());
stream(): List<Appointment>로 되어있는 appointmens를 돌린다. stream()한다.
Collection 인터페이스는 Iterable 인터페이스를 상속받고 있으며
Collection 인터페이스에 stream()이 구현되어 있다.
stream() 메소드는 순차적인 stream을 리턴한다.
StreamSupport클래스에 있는 stream()메소드를 리턴한다.
stream(= the flow of data, a sequence of data)이란
데이터의 흐름이라고 보면 된다.
이제 구현체인 StreamSupport 클래스에 stream() 메소드를 살펴보자.
stream()메소드는 인터페이스 Spliterator에서
새로운 순차적인 또는 병렬적인 stream을 만든다.
코드는 Object.requiredNonNull(spliterator)를 통해서 null인지 확인하고
추상 클래스인 ReferencePipeline에서 stream에 대한 생성자를 만들어서 리턴한다.
다음은 추상 클래스 ReferencePipeline에 있는 Head() 생성자 코드이다.
즉, stream()을 사용하면
추상 클래스인 ReferencePipeline에서
stream에 대한 생성자를 만들어서 값을 리턴한다.
'Java' 카테고리의 다른 글
[Java] 입력할 때 날짜규칙 설정: 허용 O or X - dateFormat.setLenient(false) (0) | 2023.01.13 |
---|---|
[JAVA] List, ArrayList 차이 (0) | 2023.01.04 |
json을 flat(parameter-delimiter)파일로 변환하기(json 파싱) (0) | 2022.12.16 |
[Java] 인코딩(Encoding)된 데이터를 디코딩(Decoding)하기 (0) | 2022.12.14 |
[Java] json 파일 읽기, 파싱 -Mac (0) | 2022.12.13 |
댓글