Java Collectors.toCollection() 메서드란?
Java의 Collectors 클래스에서 제공하는 toCollection() 메서드는 입력 요소들을 만난 순서(encounter order)대로 새로운 Collection에 누적하는 Collector를 반환합니다. 개발자가 원하는 컬렉션 타입을 직접 지정할 수 있어 유연성이 뛰어나다는 것이 가장 큰 장점입니다.
문법(Syntax)
static <T,C extends Collection<T>>
Collector<T,?,C> toCollection(Supplier<C> collectionFactory)
매개변수 설명
- T : 입력 요소의 타입
- C : 결과로 생성될 Collection의 타입
- Supplier : 결과를 공급하는 함수형 인터페이스
- collectionFactory : 적절한 타입의 비어 있는 새 Collection을 반환하는 Supplier
예제 1 : TreeSet으로 수집하기
다음 예제에서는 문자열 스트림을 TreeSet으로 수집합니다. TreeSet은 요소를 자동으로 정렬하고 중복을 제거하는 특징이 있습니다.
import java.util.Collection;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
Stream<String> stream = Stream.of("25", "10", "15", "20", "25");
Collection<String> collection = stream.collect(Collectors.toCollection(TreeSet::new));
System.out.println("Collection = " + collection);
}
}
실행 결과
Collection = [10, 15, 20, 25]
출력 결과를 보면 중복된 값 "25"가 제거되고, 숫자 크기순으로 정렬되어 출력된 것을 확인할 수 있습니다.
예제 2 : 이름 목록 정렬하기
이번에는 여러 개의 이름 문자열을 TreeSet으로 수집하는 예제입니다.
import java.util.Collection;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
Stream<String> stream = Stream.of("Jack", "Tom", "Brad", "Tim", "Kevin", "Bradley", "Ryan");
Collection<String> collection = stream.collect(Collectors.toCollection(TreeSet::new));
System.out.println("Collection = " + collection);
}
}
실행 결과
Collection = [Brad, Bradley, Jack, Kevin, Ryan, Tim, Tom]
모든 이름이 알파벳 순서로 자동 정렬되어 출력되는 것을 볼 수 있습니다.
정리
Collectors.toCollection()은 스트림의 요소를 ArrayList, LinkedList, TreeSet 등 원하는 컬렉션 구현체로 자유롭게 수집할 수 있는 강력한 메서드입니다. 특히 특정 컬렉션 타입이 필요하거나 정렬, 중복 제거와 같은 부가 기능이 필요할 때 매우 유용하게 활용할 수 있습니다.