-
Stream API의 map과 flatMapJava 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> result 를 List<Stream<Integer>> 로 중첩 자료형을 써서 선언했어야 합니다.
이유 : 입출력이 1:2로 변환되기 때문에
map과 flatMap의 차이점
map flatMap 입출력 1:1 변환 1:N 변환 (N >= 0) 평탄화 여부 변환된 결과를 그대로 유지 변환된 결과를 평탄화 용도 단순 변환 작업 중첩된 구조를 단일 스트림으로 처리할 때 'Java' 카테고리의 다른 글
불변 객체인 String 생성 반복에 대한 기록 (0) 2025.03.04 HashSet 의 내부 동작 방식 (0) 2025.01.22 Java : 각 자료형 간의 변환 정리 (0) 2025.01.20 객체 지향 설계 원칙 SOILD, SRP와 OCP (0) 2025.01.13 BufferedReader, BufferedWriter 기록 (0) 2025.01.10