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)와 함께 중첩 데이터를 다룰 때 매우 유용한 도구입니다.