CS

Stream API: map vs flatMap

개발자 김마늘 2025. 3. 3. 21:50

Stream API의 map과 flatMap을 비교하고 정리한 글입니다.

 

Stream API의 map과 flatMap 차이점

  • map: 스트림의 각 요소를 특정 연산을 거쳐 변환한 후 새로운 스트림을 반환합니다. 각 요소가 변환되지만, 결과적으로 스트림의 구조는 변하지 않습니다.
  • flatMap: 각 요소를 스트림으로 변환한 후, 모든 결과 스트림을 하나의 스트림으로 평탄화(flatten)하여 반환합니다. 즉, 중첩된 스트림 구조를 제거합니다.

map 사용 예시

import java.util.List;

public class MapExample {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie");

        // 각 이름을 대문자로 변환
        List<String> upperCaseNames = names.stream()
                                           .map(String::toUpperCase)
                                           .toList();

        System.out.println(upperCaseNames); // [ALICE, BOB, CHARLIE]
    }
}

map(String::toUpperCase)를 사용하여 각 문자열을 대문자로 변환합니다. 변환된 요소들이 새로운 리스트에 저장됩니다.

flatMap 사용 예시

import java.util.List;

public class FlatMapExample {
    public static void main(String[] args) {
        List<List<String>> listOfLists = List.of(
            List.of("Apple", "Banana"),
            List.of("Cherry", "Date"),
            List.of("Fig", "Grape")
        );

        // 리스트 내부의 리스트들을 평탄화하여 하나의 리스트로 만듦
        List<String> flattenedList = listOfLists.stream()
                                                .flatMap(List::stream)
                                                .toList();

        System.out.println(flattenedList); // [Apple, Banana, Cherry, Date, Fig, Grape]
    }
}

flatMap(List::stream)을 사용하여 각 내부 리스트를 스트림으로 변환한 후, 하나의 스트림으로 합칩니다. 결과적으로 List<String> 타입의 단일 리스트가 생성됩니다.

map vs flatMap 차이점 정리

map Stream<T> 각 요소를 변환한 새로운 스트림을 반환 (1:1 매핑)
flatMap Stream<T> 각 요소가 스트림을 반환할 경우 이를 평탄화하여 하나의 스트림으로 합침 (1:N 매핑)