[Java] Stream API의 map과 flatMap 차이점

한동우·2025년 4월 8일

Java

목록 보기
1/4
post-thumbnail

📘 Stream이란

Java 8부터 추가된 기능으로, 컬렉션에 저장된 데이터를 하나씩 순회하면서 처리할 수 있는 기능으로 for, for-each 형태보다 더 가독성이 좋게 다룰 수 있게 해주며, 데이터를 원하는 형식으로 변환하거나 조작하는데 효율적입니다.


1. map

map()은 각 요소를 특정 규칙에 따라 변환할 때 사용하는 연산자입니다.

public class MapExample {
	public static void main(String[] args) {
    	List<String> words = Arrays.asList("Apple", "Banana", "Airplane", "Coke", "Door", "Ant");
        
        List<Integer> wordLength = words.stream()
        				.map(String::length)
                        //.map(word -> word.length()) 와 같음
                                .collect(Collectors.toList());
                                
        System.out.println(wordLength); // 결과: [5, 6, 8, 4, 4, 3]
  
    }
}

2. flatMap

flatMap()은 중첩된 스트림 구조를 펼쳐 하나의 스트림으로 만드는 연산입니다.

public class FlatMapExample {
	public static void main(String[] args) {
    	List<List<String>> nestedList = Arrays.asList(
                Arrays.asList("JAVA", "BACKEND", "STREAM", "SPRING"),
                Arrays.asList("java", "backend", "stream", "spring")
        );

        System.out.println("list = " + nestedList); // 결과: list = [[JAVA, BACKEND, STREAM, SPRING], [java, backend, stream, spring]]

        List<String> flatList = nestedList.stream() // Stream<List<String>>으로 변환
                .flatMap(Collection::stream) // Stream<String>으로 변환
                .collect(Collectors.toList());

        System.out.println("flatList = " + flatList); // 결과: flatList = [JAVA, BACKEND, STREAM, SPRING, java, backend, stream, spring]
    }
}

3. 결론

map()flatMap() 모두 Stream API에서 데이터 흐름을 가공하고 변환하기 위한 중간 연산(Intermediate Operation)이지만 map()은 각 요소를 다른 요소로 1:1 매핑하여 결과가 중첩된 구조일지라도 그 구조를 유지하는 반면 flatMap()은 각 요소를 컬렉션, Optional, 스트림과 같은 다수의 값으로 변환한 후 이를 단일 스트림이나 Optional로 평탄화(flatten)하여 중첩을 제거한다는 차이점이 있습니다.

0개의 댓글