ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Stream API의 map과 flatMap
    Java 2025. 1. 13. 09:03
    Stream API의 map과 flatMap을 각각 설명한 후, 활용 사례에 대한 예시 코드를 첨부합니다. 그 후 map과 flatMap의 차이점을 표로 정리한 문서입니다.

     


    map

    역할 : 입력 스트림의 각 요소를 다른 객체로 매핑한다.

    입출력 : 하나의 입력 요소당 하나의 출력 요소가 있다.

    사용하는 곳 : 단순 변환 작업에 사용된다.

    map의 시각화 : https://youtu.be/pYev_wpi0QM?si=xFDDWV_X_PXkHuLE

     

     

    예시1 : names 리스트의 요소들의 문자열 길이 계산

    더보기
    List<String> names = Arrays.asList("Winter", "Summer", "Spring");
    
    // 길이를 따로 받을 list 선언
    List<Integer> nameLengths = names.stream() // 리스트 names를 스트림으로 변환
    	.map(String::length)               // 중간 연산자, 각 요소를 다른 객체로 매핑
        	.collect(Collectors.toList());     // 최종 연산자, 추출한 이름들을 리스트로 수집
        
    System.out.println(nameLengths); // 출력 : [6, 6, 6]

     

    예시2 : Person 객체에서 name 필드 추출

    더보기
    import java.util.*;
    import java.util.stream.*;
    
    class Person { // Person 클래스
        String name;
    
        Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    
    public class Main {
        public static void main(String[] args) {
            List<Person> people = Arrays.asList(
                new Person("Winter"),
                new Person("Summer"),
                new Person("Spring")
            );
    
            // Person 객체의 name 필드 추출
            List<String> names = people.stream()
                .map(Person::getName) // 각 Person 객체에서 name을 추출
                .collect(Collectors.toList());
    
            System.out.println(names); // 출력: [Winter, Summer, Spring]
        }
    }

     


    flatMap

    역할 : 입력 스트림의 각 요소를 여러 개의 요소(스트림)로 변환하고, 결과를 평탄화(flatten)하여 단일 스트림으로 병합한다.

    입출력 : 하나의 입력 요소가 0개 이상의 출력 요소로 변환될 수 있다.

    사용하는 곳 : 리스트나 배열과 같은 중첩 구조를 펼쳐 단일 스트림으로 만들 때, 하나의 값에 여러 출력을 원할 때 사용한다.

    flatMap의 시각화 : https://youtu.be/WA89tJvIG6c?si=pv2xLfSsRalCnNkd

     

    예시 1 : 중첩 리스트인 nestedList를 평탄화시켜 하나의 리스트로 출력

    더보기
    List<List<String>> nestedList = Arrays.asList(
        Arrays.asList("Winter", "Autumn"),
        Arrays.asList("Summer", "Spring")
    );
    
    // 평탄화된 요소들을 받은 리스트 선언
    List<String> flatList = nestedList.stream() // 중첩 리스트인 nestedList를 stream으로 변환
        .flatMap(List::stream)                  // 중간 연산자, flatMap을 이용한 평탄화
        .collect(Collectors.toList());          // 최종 연산자, 평탄화된 요소를 리스트로 수집
    
    System.out.println(flatList); // 출력: [Winter, Autumn, Summer, Spring]

    예시 2 :  숫자에 여러 변환을 적용하여 여러 값을 생성

    더보기
    import java.util.*;
    import java.util.stream.*;
    
    public class Main {
        public static void main(String[] args) {
            List<Integer> numbers = Arrays.asList(1, 2, 3);
    
            List<Integer> result = numbers.stream()
                .flatMap(num -> Stream.of(num * num, num * num * num)) // 제곱과 세제곱 생성
                .collect(Collectors.toList());
    
            System.out.println(result); // 출력: [1, 1, 4, 8, 9, 27]
        }
    }

     

    만약 이 부분을 map으로 하려고 했다면 List<Integer> resultList<Stream<Integer>> 로 중첩 자료형을 써서 선언했어야 합니다.

    이유 : 입출력이 1:2로 변환되기 때문에

     


    map과 flatMap의 차이점

      map flatMap
    입출력 1:1 변환 1:N 변환 (N >= 0)
    평탄화 여부 변환된 결과를 그대로 유지 변환된 결과를 평탄화
    용도 단순 변환 작업 중첩된 구조를 단일 스트림으로 처리할 때

     

Designed by Tistory.