1. Question

Collectors 클래스란?

2. Answer

Java의 Collectors 클래스는 java.util.stream.Collectors 패키지에 포함된 유틸리티 메서드들의 모음으로, Stream API의 강력한 수집(collecting) 연산을 제공한다. 이 클래스는 스트림의 요소들을 다양한 방식으로 수집하고 집계하는 기능을 통해 데이터 처리의 복잡성을 크게 줄여준다. 또한, 프로그래머가 선언적으로 즉 어떻게(How)가 아닌 무엇을(What) 수행할 것인지에 대해서만 명시함으로써 코드의 가독성과 유지보수성을 크게 향상시킬 수 있다.

Collectors 유틸리티 클래스는 자주 사용하는 컬렉터 인스턴스를 손쉽게 생성할 수 있는 정적 팩토리 메서드를 제공한다. 예를 들어 가장 많이 사용하는 직관적인 정적 메서드로 toList를 꼽을 수 있다. toList는 스트림의 모든 요소를 리스트로 수집한다.

List<Transaction> transactions =
  transactionStream.collect(Collectors.toList());

Collectors에서 제공하는 메서드의 기능은 크게 세 가지로 구분할 수 있다.

  • 스트림 요소를 하나의 값으로 리듀스하고 요약
  • 요소 그룹화
  • 요소 분할

리듀싱과 요약 => [Java] Collectors 1 - 리듀싱과 요약 그룹화 => [Java] Collectors 2 - 그룹화 분할 => [Java] Collectors 3 - 분할

3. Detail

A. 장점

  • 코드 간결성: Collectors 클래스를 사용하면, 다양한 데이터 집계 작업을 몇 줄의 코드로 간결하게 표현할 수 있다. 이는 코드의 가독성을 크게 향상시키고, 오류 발생 가능성을 줄여준다.

  • 유연성과 확장성: Collectors는 다양한 내장 컬렉터를 제공하며, 필요에 따라 사용자 정의 컬렉터를 만들어 사용할 수도 있다. 이는 다양한 데이터 수집 및 집계 요구사항에 유연하게 대응할 수 있게 해주며, 재사용 가능한 모듈러 코드를 작성할 수 있도록 해준다.

  • 성능 최적화: 특히 병렬 스트림과 함께 사용할 때, Collectors는 효율적인 데이터 수집 및 집계 매커니즘을 제공하여, 대량의 데이터를 처리할 때 성능을 향상시킬 수 있다.

  • 안정성 및 유지보수성: Collectors를 사용한 코드는 변경에 대응하기 쉽고, 오류를 추적하고 디버깅하기 쉽다. 코드의 의도가 명확하고 재사용 가능한 패턴을 활용하기 때문에, 유지보수성이 크게 향상된다.

B. 사용 예시 - joining

List<String> words = Arrays.asList("Java", "Stream", "API");
String concatenatedString = words.stream()
  .collect(Collectors.joining(", "));
System.out.println(concatenatedString); // 출력: Java, Stream, API

C. 사용 예시 - groupingBy

List<Student> students = // 학생 리스트
Map<Gender, List<Student>> groupedByGender = students.stream()
  .collect(Collectors.groupingBy(Student::getGender));

D. 사용 예시 - partitioningBy

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<Boolean, List<Integer>> partitioned = numbers.stream()
  .collect(Collectors.partitioningBy(n -> n % 2 == 0));

4. Reference

  • “모던 자바 인 액션” (저자: 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트)

태그:

카테고리:

업데이트:

댓글남기기