WeeklyStudy / modern-java-in-action

Modern Java in Action Study
0 stars 0 forks source link

collect vs Collector vs Collectors vs Collection #17

Open ahah525 opened 1 year ago

ahah525 commented 1 year ago

문제

챕터 초반부(p.197)에서 Collection, Collector, collect 를 헷갈리지 않도록 주의하자! 라고 언급하고 있다. 실제로 이번 장을 학습하면서 비슷한 용어들이 많이 사용되기 때문에 용어에 대한 정립이 꼭 필요하다고 느꼈다.

collect, Collector, Collectors, Collection 각 용어가 어떠한 의미로 사용되는지 정리해보자.

관련 목차

참고자료

ahah525 commented 1 year ago

💡collect

Collector를 매개변수로 하는 스트림의 최종연산이다.

인수로 전달되는 객체의 구현 방법대로 스트림의 요소를 수집한다.

  1. Collector 객체를 인수로 넘기는 방법
    1. Collectors 에 정의된 정적 팩토리 메서드를 전달하는 방식(예제)
    2. Collector 인터페이스를 직접 구현한 클래스를 생성하여 전달하는 방식
  2. 수집에 대한 핵심 로직을 구현하는 supplier, accumulator, combiner 메서드를 인수로 넘기는 방법(예제)
    • 가독성과 재사용성이 떨어져 잘 쓰이지 않는다.
메서드 반환 타입
collect(Collector<T, A, R> collector) R
collect(Supplier supplier, BiConsumer<R, T> accumulator, BiConsumer<R, R> combiner) R

💡Collector

리듀싱 연산을 어떻게 구현할지를 제공하는 메서드를 정의해놓은 인터페이스다.

Collector<T, A, R>

Collector 인터페이스를 구현하는 클래스는 5개의 메서드를 오버라이딩 해야한다.

메서드 기능 반환 타입 함수 디스크립터
supplier() 누적자를 만드는 함수를 반환한다. Supplier () → A
accumulator() 스트림 요소의 수집 방법을 함수로 반환한다. BiConsumer<A, T> (A, T) → void
combiner() 두 부분 누적자를 합치는 방법을 함수로 반환한다.(병렬 스트림에서 사용) BiOperator<A, A> A → A
finisher() 누적자를 결과 형식으로 최종 변환할 방법을 함수로 반환한다. 변환이 필요없는 경우 항등함수인 Function.identity()를 반환한다. Function<A, R> A → R
characteristics() 컬렉터가 수행하는 작업의 속성 정보를 담아 집합으로 반환한다.(CONCURRENT, UNORDERED, IDENTITY_FINISH) Set

💡Collectors

다양한 기능의 Collector 인터페이스를 구현한 클래스를 정적 팩토리 메서드로 제공하는 클래스다.

  • 정적 팩토리 메서드 : 객체 생성을 담당하는 클래스 메서드다.(간접적으로 생성자 호출)
    1. 리듀싱
스트림 요소를 하나의 값으로 요약하는 기능이다.

- counting(개수), summingXXX(합계), averagingXXX(평균), maxBy(최댓값), minBy(최솟값), summarizingXXX(통계), joinig(문자열 연결), reducing(범용 리듀싱)
  1. 그룹화

    스트림의 요소를 특정 기준으로 그룹화하는 기능이다.(MySQL group by 와 비슷)

    • groupingBy
  2. 분할

    스트림의 요소를 지정한 조건에 대해 참,거짓 2개의 그룹으로 분할하는 기능이다.

    • partitioningBy
  3. 컬렉션/배열로 변환

    스트림을 컬렉션이나 배열로 반환하는 기능이다.

    • toList, toMap, toCollection

💡Collection vs Collections

Untitled (5)

Collection Collections
Iterable을 상속받는 인터페이스다. Object를 상속받는 클래스다.
Collection Framework의 최상위 인터페이스다. Collection을 다루기 위한 static 메서드를 제공한다.(Arrays가 배열을 다루기 위한 메서드를 제공하는 것과 같음)

💡결론

Reference