Backend/Java

flatMap

findmypiece 2022. 9. 7. 15:15
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