Stream 정리
지금까지 알아본 Stream에 대해 정리해 보겠습니다.
1. Stream을 사용함으로써 자바에서 DB와같은 연산(선언형)이 가능
2. Stream은 사용해서 Data의 집합을 게으르게 처리하는 반복문(사용자가 요청시에만 Data처리)
3. Stream은 중간연산자를 연속해서 사용해 파이프라인을 형성할 수 있다.
이제 Stream을 이용해 Data를 그룹화하고 분할하고 요약하는 기능을 하는 방법을 알아보겠습니다.
기존 방법으로 Data의 그룹화
만약 Data에서 같은 종류의 객체들을 그룹화하고 그룹화한 객체중 가격이 가장 높은 객체를 찾는 작업을 한다면
기존에는 받은 Data들의 분류기준에 따라 나눌때 Data의 집합에서 하나씩 꺼내서 그룹화하기 위해 향샹된 for문
을 사용하고 for문 내부에 조건문으로 객체를 구분한뒤 저장하기 위해 분류기준을 Key값으로
List<T>를 value값으로 설정한 Map을 생성할 것입니다. 물론 잘 설계한 프로그램입니다.
하지만 Stream을 사용하면 더 간결하고 가독성이 높게 위의 프로그램을 구현할 수 있습니다.
위 의 코드가 Stream을 사용해서 그룹화한 예시입니다. 두 코드를 보면 같은 기능을 하지만 코드이 길이와 가독성에서 차이가 나는 것을 확인할 수 있습니다.
Collector
Stream을 사용해서 그룹화,분할,reducing 연산을 하기 위해서는 Collector에대해 알아야합니다.
Collector란 Stream의 요소를 어떤 방식으로 처리하고 추출할지 정의된 인터페이스입니다.
이런 인터페이스의 인스턴스를 쉽게 생성할 수 있는 Class로 Collectors 클래스가 있습니다.
이제 Collectors 클래스에 정의되어있는 메서드들의 기능들을 알아보겠습니다.
1. Stream 요소들의 reducing, 요약 연산
Reducing, 요약연산이란 각 요소들에 대해 연산한 결과가 1개의 값으로 나오는 것을 말합니다.
예를 들어 각 요소의 합, 최대값, 최소값, 평균, 개수등과 같은 것이 이에 해당합니다.
Collectors의 메서드는 Stream의 .collect(Collectors.메서드명)에서 호출됩니다.
couting() | 요소의 개수를 반환 | |
maxBy() | Comparator<T> | 비교 함수 인터페이스의 기준으로 최댓값인 객체를 Optional<T>로 반환 |
minBy() | Comparator<T> | 비교 함수 인터페이스의 기준으로 최솟값인 객체를 Optional<T>로 반환 |
summingInt() | 변환함수(객체를 int형으로 변환하는 매핑함수 ) | 변환된 값의 합 |
summarizingBy() | 변환함수(객체를 int형으로 변환하는 매핑함수 ) | 변환된 값의 합계, 평균, 최소값,최대값을 객체 형태로 반환 |
averageBy() | 변환함수(객체를 int형으로 변환하는 매핑함수 ) | 변환된 값의 평균값 |
joiningBy() | 구분자(생략가능) | 각요소에 toString을 적용해 1개의 String으로 만듬(각 요소마다 구분자추가) |
reducing() | 초기값,변환 함수, 연산식 | 연산식으로 변환된 값들을 연산한 결과 반환 |
위 함수 8개가 reducing과 요약에 관련된 메서드들입니다.
이 중 reducing연산은 인수 3개중 초기값과 변환 함수를 생략가능합니다. 연산식만을 인수로 넣는다면
첫번째 인수는 연산의 첫번째 요소를 초기값으로 , 변환 함수는 객체 자신을 반환하는 형태여야 합니다.
2. 요소의 그룹화
예제 코드에서 사용한 groupingBy()메서드가 요소의 그룹화에 해당하는 메서드입니다.
groupingBy의 인수로 받을 수 있는 것들은 (변환함수,Collectors 메서드) 입니다.
우선 그룹화할 기준이 1개면 변환 함수만을 인수로 받아 변환함수의 결과값이 같은 요소들을 그룹화해서 List<T>로 생성
한뒤 key값을 변환함수의 결과값으로 Map에 저장합니다.
만약 그룹화한 결과를 사용해서 연산을 할 때에는 인수로 Collectors 메서드를 받습니다.
다중 그룹화를 하고 싶은 경우에는 인수로 groupingBy를 받고, 그룹화한 것중 reducing 연산을 하고 싶은 경우에는
reducing(),maxBy()와 같은 메서드를 인수로 받습니다.
만약 그룹화한 결과를 다른 형식으로 저장하고 싶은경우에는 mapping()을 사용해 변환함수를 그룹화한 요소들에
적용합니다.
위 코드는 mapping을 사용해 분류한 요소들을 String형태로 저장한 것입니다.
3. 요소의 분할
요소의 분할에서 사용하는 메서드는 partitioningBy()입니다.
groupingBy와 같이 Collector 메서드를 인수로 받을 수 있습니다.
요소의 분할은 사실 요소의 그룹화와 같은 과정입니다. 다른 점은 분할을 할 때는 그룹화를 True,False 2가지로 그룹화 한다는 것입니다. 즉 Map의 key값이 Boolean으로 고정됩니다.
위 코드는 200칼로리 보다 높은 음식들을 분할한 것중 true에 해당되는 음식들의 이름을 저장한 결과입니다.
지금까지 Collectors 클래스의 메서드들에 대해 알아보았습니다.
'Java' 카테고리의 다른 글
CompletableFuture 클래스 (0) | 2023.12.31 |
---|---|
비동기 프로그래밍 (0) | 2023.12.30 |
Stream (0) | 2023.12.27 |
람다 표현식의 동작과정 (0) | 2023.12.21 |
람다 표현식 사용 (0) | 2023.12.21 |