JaeniWorld

[Java] Stream 데이터 수집 본문

프로그래밍/JAVA

[Java] Stream 데이터 수집

jaeni 2021. 1. 11. 22:18
반응형

Collectors

Stream의 데이터를 변형 등의 처리를 하고 원하는 자료형으로 변환해줌

-      리듀싱과 요약: 최대 최소 검색, 요약연산, 문자열 연결

-      그룹화

  • 다수준 그룹화: Collectors.groupingBy를 이용해서 항목을 다수준으로 그룹화할 수 있음. 두개의 collector사용시 두번째 컬렉터를 외부 컬렉터로 전달해 다수준 그룹화 연산을 구현할 수도 있고, 컬렉터의 인수로 컬렉터를 전다하여 계산할 수도 있다.

-      분할: 분할함수(partitioning function)을 사용하는 특수한 그룹화 기능

  • 분할함수: 비교식에 맞춰 Boolean값을 반환하며, 참과 거짓 두 요소의 스트림 리스트를 모두 유지한다.

Reduce  collector의 차이

Reduce fold operation으로써 첫번째 인자는 이전 application의 값을 반환하고 다음 인자는현재의 인자를 반환하는 Stream에서 각각의 요소에 이항연산자를 적용한다.

 반면 Collector는 집합 operation이기 때문에 각각의 요소들을 컬렉션에 추가한다. 그리고 스트림에서 서로 다른 컬렉션들은 추가된다.

 

Collector interface 메서드

-      Supplier: 새로운 결과 컨테이너 생성

-      Accumulator: 결과 컨테이너에 요소 추가 (리듀싱 연산을 수행하는 함수 반환)

-      Finisher: 최종 변환값을 결과 컨테이너에 적용 (누적자 객체를 최종 결과로 변환하면서 누적과정을 끝낼 때 호출할 함수 반환)

-      Combiner: 두 결과 컨테이너 병합 (서로다른 서브파트를 병렬로 처리할 때 누적자가 이 결과를 어떻게 처리할 것인지 정의)

-      Characteristics: 컬렉터의 연산을 정의하는 Characteristics 형식의 불변 집합 반환

  •  Characteristics: 스트림을 병렬로 리듀스할것인지 병렬로 리듀스하면 어떤 최적화를 선택해야 할지 힌트를 제공하며 아래 표의 세 항목을 포함하는 열거형이다.
UNORDERED 리듀싱 결과는 스트림 요소의 바운 순서나 누적 순서에 영향을 받지 않음
CONCURRENT 다중 스레드에서 Accumulator 함수를 동시에 호출할 수 있으며, 병렬 리듀싱을 수행할 수 있음. UNORDERED와 함께 설정하지 않았다면 데이터 소스가 정렬되어 있지 않은 상태에서만 병렬 리듀싱 수행
IDENTITY_FINISH 생략가능하므로 리듀싱 과정의 최종 결과로 누적자 객체를 바로 사용할 수 있음. 또한, 누적자 A R로 안전하게 형변환할 수 있다.

 

 

 

Reference

-docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

- 모던 자바 인 액션

- https://stackoverflow.com/questions/22577197/java-8-streams-collect-vs-reduce

 

모던 자바 인 액션

자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴

www.yes24.com

 

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

[Java] 디폴트 메소드(Default methods)  (0) 2021.01.12
[Java] Java 8에 추가된 API  (0) 2021.01.12
[Java] Collection factory  (0) 2021.01.12
[Java] Stream 연산  (0) 2021.01.11
[Java] Stream API, Stream과 Collection의 차이  (0) 2021.01.11
Comments