<aside> 📖 이 장의 내용
</aside>
컬렉션(
Collection
), 컬렉터(Collector
),collect
는 다 다른 것이다.
Stream
에 toList
를 사용하는 대신 더 범용적인 컬렉터 파라미터를 collect
메서드에 전달함으로써 원하는 연산을 간결하게 구현할 수 있음을 지금부터 배우게 될 것이다.
// 맛보기
Map<Currency, List<Transaction>> transactionsByCurrencies =
transacitons.stream()
.collect(groupingBy(Transaction::getCurrency));
명령형 프로그래밍에 비해 함수형 프로그래밍이 훠~~~얼씬 더 편리하다.
함수형 프로그래밍에선 무엇을 원하는지 직접 명시할 수 있어서 어떤 방법으로 이를 얻을지는 신경 쓸 필요가 없다. 다수준 multilevel 로 그룹화를 수행할 때 명령형과 함수형 프로그래밍의 차이점이 더욱 두드러집니다. 명령형 코드는 문제를 해결하는 과정에서 다중 루프와 조건문을 추가하여 가독성 및 유지보수성이 크게 떨어진다. but 함수형 프로그래밍은 필요한 컬렉터를 쉽게 추가하여 해결할 수 있습니다.
고급 리듀싱 기능을 수행하는 컬렉터
훌륭하게 설게된 함수형 api의 또 다른 장점으로 높은 수준의 조합성과 재사용성을 꼽을 수 있다. collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 최대 강점이다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬렉터가 작업을 처리한다.
Collector 인터페이스의 메서드를 어떻게 구현하느냐에 따라 스트림에 어떤 리듀싱 연산을 수행할지 결정한다. Collectors 유틸리티 클래스는 자주 사용하는 컬렉터 인스턴스를 손쉽게 생성할 수 있는 정적 팩토리 메서드를 제공한다. 예를 들어 가장 많이 사용하는 직관적인 정적 메서드로 toList(스트림의 모든 요소를 리스트로 수집한다)가 있다.
미리 정의된 컬렉터
미리 정의된 컬렉터, 즉 groupingBy 같이 collectors 클래스에서 제공하는 팩토리 메서드의 기능을 설명한다. Collectors에서 제공하는 메서드의 기능은 크게 세 가지로 구분할 수 있다.
컬렉터 : 리듀싱과 요약 관련 기능을 수행한다.