이론 정리/java
java stream collector
철매존
2023. 12. 30. 02:07
728x90
정리
Collector
- 고급 리듀싱 기능을 수행하는 컬렉터
- 함수형 API의 장점 중 높은 수준의 조합성과 재사용성을 꼽을 수 있음
- collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있는게 컬렉터의 최대 장점
- 보통 함수를 요소로 변환하는 경우(데이터 저장 구조를 변환) 컬렉터를 적용해서 누적한다.
- 직관적으로
toList
같은거
- 미리 정의된 컬렉터
- 미리 정의된 것이고, 크게 3가지 역할 수행
- 요약 연산
- 합계나 평균값 계산 등 연산을 요약하는것
- 문자열 연결
- 말 그대로 연결하는거고 뭐 사이에 구분자 넣는것도 가능
- 범용 리듀싱 요약 연결
- 위에서 한것들을 이걸 통해 정의 가능(reducing 팩토리 메서드)
- 위에서 한거를 이거는 다른 방식으로 쓸 수 있는것이다(프로그램적으로 위의 것들이 편하지만 이거는 다른 역할을 하는데)
- 컬렉션 프레임워크 유연성
- 같은 구현도 이걸 쓰면 다른 방식으로 가능
- 상황에 맞는 최적의 해법 선택
- 저게 결국 요약 연산이나 범용 리듀싱 쓰는거 이런거를 고려해 보면 하나의 결과를 낼 때 다양한 방식을 사용할 수 있다.
- 그냥 스트림 인터페이스를 쓰는 것이 코드가 더 단순할 수 있지만 이렇게 Collector을 쓰면 재사용성과 커스터마이징이 쉽다는 것 -> 높은 수준의 추상화와 일반화!
- 컬렉션 프레임워크 유연성
- 요약 연산
- 미리 정의된 것이고, 크게 3가지 역할 수행
그룹화
- 명령형으로 그룹화하면 까다롭고 에러가 날 확률도 높은데 함수형은 쉽게 가능
- 걍
groupingBy
같은거 쓰면 되니까- 이거 참고로 막 여러 기준을 통한 그룹화도 가능하다.
- 그룹화된 요소 조작
- flatMapping같은걸 써서 묶을 수 있음
- 중복되는걸로 그룹화해서 묶는거임 -> 한글[가나다] 영어[ABC] 요렇게
- flatMapping같은걸 써서 묶을 수 있음
- 다수준 그룹화
- 글자[한글[가나다], 영어[ABC]] 요렇게도 이걸 쓰면 가능함
- 서브그룹으로 데이터 수집
- 제한이 없어서 컬렉터를 전달해서 계산할수도 있다.
- 글자수[한글=3, 영어=3] 이런식으로
- 그룹화된 요소 조작
- 이거 참고로 막 여러 기준을 통한 그룹화도 가능하다.
분할
- 분할 함수라 불리는 프레디케이트를 분류 함수로 사용하는 특수한 그룹화 기능이다.
- 키 형식은 Boolean(즉 그룹화 맵은 최대 2개)
- 장점
- 참/거짓 두개 요소의 스트림 리스트를 모두 유지한다.
Collector 인터페이스
- Collector 인터페이스는 리듀싱 연산(즉 컬렉터)를 어떻게 구현할지 제공하는 메서드 집합으로 구성
- 5개의 메서드가 정의되어 있다.
- supplier
- 빈 결과로 이루어진 Supplier를 반환
- 즉 수집 과정에서 빈 누적자 인스턴스를 만드는 파라미터가 없는 함수
- accumulator
- 결과 컨테이너에 요소 추가
- 리듀싱 연산을 수행하는 함수를 반환
- n번째 요소를 탐색할 때
1~n-1
랑n
번째 요소를 함수에 적용 - 반환값은 void
- 요소를 탐색하면서 적용하는 함수에 의해 누적자 내부상태가 바뀌므로 누적자가 어떤 값인지 단정할 수 없다.
- finisher
- 스트림 탐색을 끝내고 누적자 객체를 최종 결과로 변환하면서 누적 과정을 끝날 때 호출할 함수를 반환
- combiner
- 두 결과 컨테이너 병합
- 서로 다른 서브파티를 병렬로 처리할 때 이 결과를 어떻게 처리할지 정의
- 이걸 통해 스트림의 리듀싱을 병렬로 수행 가능
- Characteristics
- 컬렉터 연산을 정의하는 Characteristics 형식의 불변 집합을 반환
- 스트림을 병렬로 리듀스할지, 만약 그렇게 한다면 어떻게 최적화할지 힌트 제공
- supplier
정리
- collect는 스트림의 요소를 요약 결과로 누적하는 다양한 방법(컬렉터라 불리는)을 인수로 갖는 최종 연산이다.
- 요소를 하나의 값으로 리듀스하고 요약하는것 뿐 아니라 최소/최대값, 평균값 계산 등의 컬렉터가 미리 정의됨
- 미리 정의된 컬렉터를 통해 그룹화 및 분할 가능
- 다수준의 그룹화, 분할, 리듀싱 연산에 적합하게 설계되어 있다.