Map과 FlatMap 차이
flatMap()은 Java 스트림 API에서 제공하는 중간 연산 메서드로, 스트림의 각 요소를 다른 스트림으로 변환하고, 이를 하나의 평평한 스트림(flat stream)으로 병합합니다. 즉, 각 요소가 1대1로 변환되는 map()과 달리, 각 요소가 1대다로 변환될 때 유용합니다.
주요 특징
- 입력과 출력:
- flatMap은 스트림의 각 요소를 처리하여 새로운 스트림으로 변환합니다.
- 결과적으로, 다중 레벨의 스트림이 단일 레벨의 스트림으로 평탄화(flatten)됩니다.
- 용도:
- 중첩된 데이터 구조(예: 리스트 안의 리스트)를 평탄화하고 단일 레벨로 변환하는 데 유용합니다.
- 각 요소가 리스트, 배열, 컬렉션 또는 또 다른 스트림일 때 사용됩니다.
flatMap()과 map()의 차이
- map():
- 입력 요소 하나를 변환하여 하나의 출력 요소로 매핑.
- 결과는 스트림의 스트림이 될 수 있음.
- flatMap():
- 입력 요소 하나를 변환하여 다수의 출력 요소로 매핑.
- 모든 결과를 하나의 평탄한 스트림으로 병합.
예제 1: map() vs flatMap()
java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("A", "B"),
Arrays.asList("C", "D", "E"),
Arrays.asList("F", "G")
);
// map()을 사용한 경우
List<List<String>> resultUsingMap = nestedList.stream()
.map(list -> list)
.collect(Collectors.toList());
System.out.println("Using map: " + resultUsingMap);
// flatMap()을 사용한 경우
List<String> resultUsingFlatMap = nestedList.stream()
.flatMap(list -> list.stream())
.collect(Collectors.toList());
System.out.println("Using flatMap: " + resultUsingFlatMap);
}
}
출력:
Using map: [[A, B], [C, D, E], [F, G]]
Using flatMap: [A, B, C, D, E, F, G]
- map()은 각 요소를 그대로 유지하면서 리스트의 리스트(List<List<String>>) 형태를 반환합니다.
- flatMap()은 리스트 내부의 리스트를 평탄화하여 단일 리스트(List<String>)로 반환합니다.
예제 2: 문자열의 단어 추출
java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<String> sentences = Arrays.asList(
"Hello World",
"Java Streams",
"FlatMap Example"
);
// 각 문장을 단어로 분리하여 단일 리스트로 병합
List<String> words = sentences.stream()
.flatMap(sentence -> Arrays.stream(sentence.split(" ")))
.collect(Collectors.toList());
System.out.println(words);
}
}
출력:
[Hello, World, Java, Streams, FlatMap, Example]
- 각 문장이 " "(공백)으로 분리되어 단어들의 스트림으로 변환됩니다.
- flatMap()은 각 스트림을 하나의 스트림으로 병합하여 단일 리스트로 수집합니다.
예제 3: 숫자 리스트를 평탄화
java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<int[]> listOfArrays = Arrays.asList(
new int[]{1, 2},
new int[]{3, 4},
new int[]{5, 6}
);
// 각 배열을 스트림으로 변환 후 평탄화
List<Integer> flattenedList = listOfArrays.stream()
.flatMapToInt(Arrays::stream)
.boxed()
.collect(Collectors.toList());
System.out.println(flattenedList);
}
}
출력:
[1, 2, 3, 4, 5, 6]
- 각 배열(int[])이 스트림(IntStream)으로 변환되고, 평탄화 후 리스트로 수집됩니다.
주요 메서드 변형
- flatMap(): 객체 스트림을 평탄화합니다.
- flatMapToInt(): IntStream으로 평탄화.
- flatMapToDouble(): DoubleStream으로 평탄화.
- flatMapToLong(): LongStream으로 평탄화.
결론
- flatMap()은 중첩된 스트림이나 리스트를 단일 스트림으로 평탄화하는 데 사용되며, 데이터가 계층적 구조를 가질 때 매우 유용합니다.
- map()과의 차이를 이해하면 스트림 처리에서 보다 효율적으로 작업을 수행할 수 있습니다.
반응형
'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글
JAVA | 이진트리 구현 (0) | 2024.11.26 |
---|---|
Stream | String문자열 내부 정렬 (0) | 2024.11.21 |
해시맵 (0) | 2024.11.17 |
String[]을 ArrayDeque<String>로 변환 (0) | 2024.11.17 |
JAVA | 문자열 슬라이싱 (1) | 2024.11.03 |