728x90
java8 이후 stream 을 많이 사용해왔지만 그동안 flatMap 은 사용해본 적이 없다. 설명을 봐도 잘 모르겠고 딱히 필요성을 느끼지 못했다. 현재 내게 필요한 건 flatMap 어떻게 사용하나? 가 아니라 flatMap 이 왜 필요한가? 이다.
그런데 오픈소스들을 보면 flatMap를 사용한 예제가 꽤 되어서 flatMap 에 대해 다시 알아봤다. 서칭해보니 map 과 비교하는 글들이 많은데 용어만 비슷할 뿐 역할이 완전히 다른데 왜 비교하는지 모르겠다..
일단 flatMap 의 역할은 스트림 평탄화 라고 한다. flatMap 은 스트림을 리턴해야 하고 그렇게 리턴된 스트림은 1차원 평탄화 된다.
즉, 다차원 배열 또는 다차원 리스트? 를 단일배열 또는 단일 리스트로 변환해야 할 때 필요하다. 여기에서는 다차원 리스트를 예로 들어보자.
List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("A", "B", "C"));
list.add(Arrays.asList("D", "E"));
list.add(Arrays.asList("F"));
List<String> flatMapList = list.stream()
.flatMap(e -> e.stream())
.collect(Collectors.toList());
for (String s : flatMapList) {
System.out.println(s);
}
/*
result..
A
B
C
D
E
F
*/
물론 아래와 같이 map 을 활용해서 구현할 수도 있다.
List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("A", "B", "C"));
list.add(Arrays.asList("D", "E"));
list.add(Arrays.asList("F"));
List<String> mapList = list.stream()
.map(e -> e.stream()
.collect(Collectors.toList()))
.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
for (String s : mapList) {
System.out.println(s);
/*
result..
A
B
C
D
E
F
*/
하지만 map의 역할은 리스트의 각 요소를 다른 형태로 전환하는 것이기 때문에 평탄화를 통해 수평확장을 하는 flatMap 과는 다소 거리가 있어 보인다.
728x90
'Backend > Java' 카테고리의 다른 글
JVM 실행 옵션 정리 (0) | 2022.01.10 |
---|---|
@JsonCreator (0) | 2021.11.19 |
AutoBoxing과 AutoUnBoxing (0) | 2021.08.25 |
@Async, CompletableFuture, parallelStream (0) | 2021.07.14 |
Collections.EMPTY_LIST, Collections.EMPTY_MAP (0) | 2021.07.12 |