명령형 코드에서는 다중 루프와 조건문을 추가하며 가독성과 유지보수성이 크게 떨어진다. 함수형 프로그래밍에서는 필요한 컬렉터를 쉽게 추가할 수 있다.
함수형 API의 장점으로 높은 수준의 조합성과 재사용성을 꼽을 수 있다.
collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬렉터가 작업을 처리한다.
보통 함수를 요소로 변환할 때는 컬렉터를 적용하며 최종 결과를 저장하는 자료구조에 값을 누적한다.
Collectors 유틸리티 클래스는 자주 사용하는 컬렉터 인스턴스를 손쉽게 생성할 수 있는 정적 팩토리 메서드를 제공하는데, 가장 많이 사용하는 직관적인 정적 메서드로 toList를 꼽을 수 있다.
List<Transaction> transactions = transactionStream.collect(Collectors.toList());
Collectors에서 제공하는 메서드의 기능은 크게 세 가지로 구분할 수 있다.
컬렉터로 스트림의 항목을 컬렉션으로 재구성할 수 있다. 좀 더 쉽게 말하자면 컬렉터로 스트림의 모든 항목을 하나의 결과로 합칠 수 있다.
long howManyDishes = menu.stream().collect(Collectors.counting());
// 불필요한 과정 생략
long howManyDishes = menu.stream().count();