# 사용하는 이유
flatMap은 **스트림을 평탄화(flatten)하면서 매핑(mapping)**할 때 가장 적합한 메서드
=> "스트림을 평탄화(flatten)" 한다는 의미는, 중첩된 리스트나 스트림 구조를 하나의 연속된 스트림으로 "펼쳐서" 만드는 것.
ex)
1)문제
List<List<String>> nestedList = List.of(
List.of("A", "B"),
List.of("C", "D"),
List.of("E")
);
## map만 사용시
List<Stream<String>> result = nestedList.stream() .map(List::stream) .collect(Collectors.toList());
=> System.out.println(result);
[java.util.stream.ReferencePipeline$Head@1cf8d97f,
java.util.stream.ReferencePipeline$Head@2f0c899e,
java.util.stream.ReferencePipeline$Head@3f0c99fe]
위처럼 스트림 객체로만 남음. (별도의 스트림 객체들이 들어 있는 상태)
왜 이렇게 출력되나?
nestedList.stream().map(List::stream)은 각 내부 리스트(List<String>)를 스트림(Stream<String>)으로 변환하고, 이 스트림들을 모아 **리스트(List<Stream<String>>)**로 수집하기 때문.
하지만 스트림 객체 자체를 출력하면, 스트림의 실제 데이터가 아니라 스트림 객체의 참조 값(예: ReferencePipeline$Head@1cf8d97f)이 출력됨.
스트림은 "지연 연산" 방식으로 동작하므로, 스트림 내부의 데이터를 직접 출력하려면 최종 연산(예: forEach, collect)이
필요.
## flatmap 사용 시
List<String> flattenedList = nestedList.stream() .flatMap(List::stream) .collect(Collectors.toList());
=> System.out.println(flattenedList);
[A, B, C, D, E]
위처럼 하나의 리스트로 펼쳐진 형태가 됨.
##
BigDecimal totalAmount = carts.stream()
.flatMap(cart -> cart.getCartItems().stream())
.map(item -> item.getProduct().getPrice().multiply(BigDecimal.valueOf(item.getQuantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
=> 위의 소스처럼 장바구니 안에 있는 것을 스트림을 평탄화 시키고, 평탄화 시킨것을 item에 담아서 각각의 물품의 가격을 계산하고 더해줄때 또는 나열해서 보고 싶을때 사용한다.

'개발 > JAVA' 카테고리의 다른 글
[CORS] 해결 (Proxy Pattern) (0) | 2024.10.02 |
---|---|
VO, DTO의 차이 (0) | 2023.08.16 |
[stream API] 같은 뜻 간결하게 만들기 위해 사용 (0) | 2023.04.19 |
[Java] if문을 조건부 연산자로 변경 (0) | 2023.03.06 |
[JAVA] api 요청시 Return JSON 데이터 Pretty로 나오게 하는법. (0) | 2023.03.02 |