이론 정리/java

java stream collector

철매존 2023. 12. 30. 02:07
728x90

정리

Collector

  • 고급 리듀싱 기능을 수행하는 컬렉터
    • 함수형 API의 장점 중 높은 수준의 조합성과 재사용성을 꼽을 수 있음
    • collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있는게 컬렉터의 최대 장점
    • 보통 함수를 요소로 변환하는 경우(데이터 저장 구조를 변환) 컬렉터를 적용해서 누적한다.
    • 직관적으로 toList 같은거
  • 미리 정의된 컬렉터
    • 미리 정의된 것이고, 크게 3가지 역할 수행
      • 요약 연산
        • 합계나 평균값 계산 등 연산을 요약하는것
      • 문자열 연결
        • 말 그대로 연결하는거고 뭐 사이에 구분자 넣는것도 가능
      • 범용 리듀싱 요약 연결
        • 위에서 한것들을 이걸 통해 정의 가능(reducing 팩토리 메서드)
        • 위에서 한거를 이거는 다른 방식으로 쓸 수 있는것이다(프로그램적으로 위의 것들이 편하지만 이거는 다른 역할을 하는데)
          • 컬렉션 프레임워크 유연성
            • 같은 구현도 이걸 쓰면 다른 방식으로 가능
          • 상황에 맞는 최적의 해법 선택
            • 저게 결국 요약 연산이나 범용 리듀싱 쓰는거 이런거를 고려해 보면 하나의 결과를 낼 때 다양한 방식을 사용할 수 있다.
            • 그냥 스트림 인터페이스를 쓰는 것이 코드가 더 단순할 수 있지만 이렇게 Collector을 쓰면 재사용성과 커스터마이징이 쉽다는 것 -> 높은 수준의 추상화와 일반화!

그룹화

  • 명령형으로 그룹화하면 까다롭고 에러가 날 확률도 높은데 함수형은 쉽게 가능
  • groupingBy 같은거 쓰면 되니까
    • 이거 참고로 막 여러 기준을 통한 그룹화도 가능하다.
      • 그룹화된 요소 조작
        • flatMapping같은걸 써서 묶을 수 있음
          • 중복되는걸로 그룹화해서 묶는거임 -> 한글[가나다] 영어[ABC] 요렇게
      • 다수준 그룹화
        • 글자[한글[가나다], 영어[ABC]] 요렇게도 이걸 쓰면 가능함
      • 서브그룹으로 데이터 수집
        • 제한이 없어서 컬렉터를 전달해서 계산할수도 있다.
        • 글자수[한글=3, 영어=3] 이런식으로

분할

  • 분할 함수라 불리는 프레디케이트를 분류 함수로 사용하는 특수한 그룹화 기능이다.
  • 키 형식은 Boolean(즉 그룹화 맵은 최대 2개)
  • 장점
    • 참/거짓 두개 요소의 스트림 리스트를 모두 유지한다.

Collector 인터페이스

  • Collector 인터페이스는 리듀싱 연산(즉 컬렉터)를 어떻게 구현할지 제공하는 메서드 집합으로 구성
  • 5개의 메서드가 정의되어 있다.
    • supplier
      • 빈 결과로 이루어진 Supplier를 반환
      • 즉 수집 과정에서 빈 누적자 인스턴스를 만드는 파라미터가 없는 함수
    • accumulator
      • 결과 컨테이너에 요소 추가
      • 리듀싱 연산을 수행하는 함수를 반환
      • n번째 요소를 탐색할 때 1~n-1n번째 요소를 함수에 적용
      • 반환값은 void
      • 요소를 탐색하면서 적용하는 함수에 의해 누적자 내부상태가 바뀌므로 누적자가 어떤 값인지 단정할 수 없다.
    • finisher
      • 스트림 탐색을 끝내고 누적자 객체를 최종 결과로 변환하면서 누적 과정을 끝날 때 호출할 함수를 반환
    • combiner
      • 두 결과 컨테이너 병합
      • 서로 다른 서브파티를 병렬로 처리할 때 이 결과를 어떻게 처리할지 정의
      • 이걸 통해 스트림의 리듀싱을 병렬로 수행 가능
    • Characteristics
      • 컬렉터 연산을 정의하는 Characteristics 형식의 불변 집합을 반환
      • 스트림을 병렬로 리듀스할지, 만약 그렇게 한다면 어떻게 최적화할지 힌트 제공

정리

  • collect는 스트림의 요소를 요약 결과로 누적하는 다양한 방법(컬렉터라 불리는)을 인수로 갖는 최종 연산이다.
  • 요소를 하나의 값으로 리듀스하고 요약하는것 뿐 아니라 최소/최대값, 평균값 계산 등의 컬렉터가 미리 정의됨
  • 미리 정의된 컬렉터를 통해 그룹화 및 분할 가능
  • 다수준의 그룹화, 분할, 리듀싱 연산에 적합하게 설계되어 있다.