Java
Stream API의 map과 flatMap
00z11
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) |
평탄화 여부 | 변환된 결과를 그대로 유지 | 변환된 결과를 평탄화 |
용도 | 단순 변환 작업 | 중첩된 구조를 단일 스트림으로 처리할 때 |