본문 바로가기
codeit sprint backend/weekly paper

[2-2] Java 고급과정: map vs flatMap

by boolynn 2026. 1. 22.

✔️ map vs flatMap

flap과 flatmap은 Steam API에서 사용되는 메소드로, 모두 요소를 변환하는 역할을 수행하지만 결과물의 구조에서 차이를 갖는다.

map

map은 스트림의 요소를 1:1로 변환하여, 결과물로 기존과 동일한 길이와 구조의 새로운 Stream을 반환한다.

따라서 스트림의 각 요소를 하나씩 가져와 변환할 때 사용된다. 구체적인 사례로는 리스트 내 객체에서 특정 필드만 추출, 모든 문자를 대문자로 변환을 들 수 있다.

 

아래는 모든 문자를 대문자로 변환할 때의 코드이다.

List<String> words = Arrays.asList("happy", "cat");

List<String> upperCaseWords = words.stream()
                                   .map(String::toUpperCase) // 각 요소를 대문자로 변환
                                   .collect(Collectors.toList());

System.out.println(upperCaseWords); // 결과 출력: [HAPPY, CAT]

.map(String::toUpperCase)  :  스트림의 각 요소에 대해 toUpperCase() 메서드를 실행하여 새로운 값으로 매핑한다.

이때 원본 리스트인 words는 변하지 않으며, 대문자로 변환된 동일한 구조의 새로운 리스트가 생성된다.

 

flatMap

flatMap은 스트림의 요소를 1:N으로 변환하여, 결과물로 중첩된 스트림들을 하나의 스트림으로 평탄화하여 변환한다.

쉽게 말해 모든 여러 스트림의 요소를 하나의 스트림으로 합치는 것으로, 2차원 리스트를 1차원으로 합치거나, 하나의 객체가 여러 개의 자식 객체를 가질 때 이를 모두 펼쳐 처리하기 위해 사용할 수 있다.

 

아래는 단어를 철자 단위로 쪼개 대문자 알파벳 리스트를 만드는 코드로, map과 flatMap의 차이를 직관적으로 이해할 수 있다.

List<String> words = Arrays.asList("happy", "cat");

List<String> uniqueLetters = words.stream()
    .map(word -> word.split("")) // Stream<String[]> 으로 변환
    .flatMap(Arrays::stream)     // flatMap: Stream<String[]>을 Stream<String>으로 평탄화
    .map(String::toUpperCase)    // map: 대문자 변환
    .collect(Collectors.toList());

// 결과: [H, A, P, P, Y, C, A, T]

 

✔️ 정리

구분 map flatMap
관계 1:1 변환 1:N 변환
결과 타입 Stream <T> → Stream<R> Stream<List<T>> → Stream<T>
주요 목적 단순 값 변환 중첩 구조 제거 및 결합