collect() 메서드란?
Stream API의 collect() 메서드는 스트림에 담긴 모든 요소를 수집하여 지정된 컬렉션 타입에 저장하는 최종 연산(terminal operation)입니다. 개발자가 결과를 어떤 컬렉션에 저장할지 직접 지정해야 하며, 이때 Collectors 클래스를 활용합니다.
Collectors에는 다양한 유틸리티 메서드가 제공되지만, 실무에서 가장 많이 사용되는 것은 다음 세 가지입니다.
- Collectors.toList() — 스트림 요소를
List로 수집 - Collectors.toSet() — 스트림 요소를 중복 없는
Set으로 수집 - Collectors.toMap() — 키와 값의 쌍으로
Map형태로 수집
문법(Syntax)
<R, A> R collect(Collector<? super T,A,R> collector)
제네릭 타입 매개변수 R은 최종 결과 타입, A는 누적기(accumulator)의 중간 타입을 의미하며, T는 스트림 요소의 타입입니다.
예제 코드
아래 예제는 Java 9에서 새롭게 도입된 takeWhile(), dropWhile(), 그리고 3개 인자를 받는 iterate() 메서드와 함께 collect()를 사용하는 방법을 보여줍니다.
import java.util.*;
import java.util.stream.*;
public class StreamCollectMethodTest {
public static void main(String args[]) {
List<String> list = List.of("a", "b", "c", "d", "e", "f", "g", "h", "i");
// "e"를 만나기 전까지의 요소만 수집
List<String> subset1 = list.stream()
.takeWhile(s -> !s.equals("e"))
.collect(Collectors.toList());
System.out.println(subset1);
// 조건이 처음으로 거짓이 되는 지점부터 나머지 요소 수집
List<String> subset2 = list.stream()
.dropWhile(s -> !s.equals("e"))
.collect(Collectors.toList());
System.out.println(subset2);
// 1부터 10까지 반복 생성한 숫자 스트림을 List로 수집
List<Integer> numbers = Stream.iterate(1, i -> i <= 10, i -> i+1)
.collect(Collectors.toList());
System.out.println(numbers);
}
}
코드 설명
- takeWhile(): 주어진 조건이 참인 동안에만 요소를 스트림에 포함시킵니다. 위 예제에서는 "e"가 아닌 동안의 요소인
a, b, c, d가 수집됩니다. - dropWhile(): 조건이 참인 동안의 요소를 버리고, 조건이 처음 거짓이 되는 시점부터 나머지 요소를 반환합니다. 따라서
e, f, g, h, i가 수집됩니다. - iterate(seed, predicate, next): 초기값, 종료 조건, 다음 값을 생성하는 함수를 받아 유한한 스트림을 만듭니다. 여기서는 1부터 10까지의 정수 스트림을 생성했습니다.
실행 결과(Output)
[a, b, c, d] [e, f, g, h, i] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
이처럼 collect() 메서드와 Collectors를 조합하면 스트림 처리 결과를 원하는 컬렉션 형태로 손쉽게 변환할 수 있어, 데이터 필터링 및 변환 작업에서 매우 유용하게 활용됩니다.