Stream API의 map과 flatmap의 차이점

chaewon·2025년 4월 13일

Stream API란?

컬렉션 데이터를 효율적으로 처리하는 기능
다양한 메서드들이 있어 데이터를 연속 처리하거나 반복적으로 처리할 때 도움이 된다.
filter(), map(), collect() 등의 다양한 메서드
루프나 조건문을 사용해야 할 때 이 메서드들로 간단한 코드를 짤 수 있다.

이 외에도 다양한 장점이 있는데 추후 다른 포스트로 연결하도록 하겠다.

1. Stream API의 map()

map은 스트림의 각 요소를 변환한다. 변경 사항을 각 요소에 적용해준다.
다음 코드를 살펴보자.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Words {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "hi", "hey");

        // 각 단어 앞에 "WOW!"를 붙이고 대문자로 변환
        List<String> funWords = words.stream()
                                      .map(word -> "WOW! " + word.toUpperCase())
                                      .collect(Collectors.toList());

        System.out.println(Words);  // [WOW! hello, WOW! hi, WOW! hey]
    }
}

2. Stream API의 flatmap

flatMap은 각 요소를 여러 개의 요소로 변환하고, 그 결과를 평탄화(flatten) 해서 하나의 스트림으로 합친다.

여기서 평탄화란 중첩된 다차원 리스트, 예를 들어 2d 리스트가 있다하면 그것을 한 줄의 리스트로 만들어주는 것을 의미한다.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FunFlatMap {
    public static void main(String[] args) {
        // 중첩된 리스트
        List<List<Integer>> listOfLists = Arrays.asList(
            Arrays.asList(1, 2),
            Arrays.asList(3, 4, 5),
            Arrays.asList(6, 7, 8)
        );

        // flatMap을 사용해서 숫자들 앞에 "WOW!"를 추가하고 평탄화
        List<String> funList = listOfLists.stream()
                                          .flatMap(list -> list.stream()
                                                               .map(num -> "WOW! " + num))  // 숫자 앞에 "WOW!" 추가
                                          .collect(Collectors.toList());

        System.out.println(funList);  // [WOW! 1, WOW! 2, WOW! 3, WOW! 4, WOW! 5, WOW! 6, WOW! 7, WOW! 8]
    }
}

3. map()과 flatmap()

두 메서드는 모두 스트림의 각 요소를 변환하는데 사용
하지만 동작 방식이 다르다.

  • map()은 각 원소를 하나의 값으로 변환 > 단순 변환에 적합
  • flatmap()은 각 원소를 여러개의 원소고 변환 후 평탄화 > 복잡한 데이터 구조 평탄화 또는 중첩된 데이터 처리에 적합

0개의 댓글