Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9의 Collectors.flatMapping() 메서드 완벽 가이드: 중첩 컬렉션 처리의 핵심

Collectors.flatMapping()이란?

Java 9에서는 Collectors 클래스에 새로운 정적 메서드인 flatMapping()이 추가되었습니다. 이 메서드는 기존의 Collectors.mapping()과 유사하지만, 중첩된 컬렉션(nested collections)을 훨씬 더 효율적으로 처리할 수 있다는 점에서 차별화됩니다.

Collectors.flatMapping()은 두 가지 인자를 받습니다.

  • 입력 요소에 적용할 매핑 함수(Function)
  • 함수를 통과한 요소들을 누적할 다운스트림 컬렉터(Collector)

Collectors.mapping()과의 핵심적인 차이는 flatMapping()이 요소의 스트림(Stream) 자체를 직접 다룬다는 점입니다. 이 덕분에 각 요소마다 불필요한 중간 컬렉션을 생성할 필요가 없어져 코드가 간결해지고 성능도 향상됩니다.

문법(Syntax)

public static <T,U,A,R> Collector<T,?,R> flatMapping(
    Function<? super T, ? extends Stream<? extends U>> mapper,
    Collector<? super U,A,R> downstream
)

사용 예제

다음 예제는 여러 개의 리스트로 구성된 스트림을 리스트의 크기(size)별로 그룹화하고, 각 그룹 안에서 짝수만 필터링해 하나의 리스트로 평탄화하는 코드입니다.

import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public class FlatMappingMethodTest {
    public static void main(String args[]) {
        Map<Integer, List<Integer>> map = Stream.of(List.of(1, 2, 3, 4, 5, 6), List.of(7, 8, 9, 10))
                .collect(Collectors.groupingBy(
                        Collection::size,
                        Collectors.flatMapping(
                                l -> l.stream()
                                      .filter(i -> i % 2 == 0),
                                Collectors.toList())
                ));
        System.out.println(map);
    }
}

실행 결과

{4=[8, 10], 6=[2, 4, 6]}

결과 해석

  • 크기가 6인 리스트 [1, 2, 3, 4, 5, 6]에서 짝수만 추출 → [2, 4, 6]
  • 크기가 4인 리스트 [7, 8, 9, 10]에서 짝수만 추출 → [8, 10]

만약 flatMapping() 대신 mapping()을 사용했다면, 각 리스트마다 별도의 스트림 객체나 중간 컬렉션이 생성되어 결과 구조가 복잡해지고 성능도 떨어졌을 것입니다. flatMapping()은 이러한 중간 단계를 제거하므로, 그룹화(groupingBy)와 함께 중첩 데이터를 다룰 때 매우 유용한 도구입니다.