IT'S DO
Published 2025. 1. 14. 16:27
[JAVA] Flatmap 사용 개발/JAVA
728x90

# 사용하는 이유

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에 담아서 각각의 물품의 가격을 계산하고 더해줄때 또는 나열해서 보고 싶을때 사용한다.

 

profile

IT'S DO

@멋진놈

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!