스트림으로 데이터 수집
Collectors 클래스로 컬렉션을 만들고 사용하기
컬렉터
collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이
컬렉터의 최대 강점
Collectors에 제공하는 메서드의 기능 3가지
- 스트림 요소를 하나의 값으로 리듀스하고 요약
- 요소 그룹화
- 요소 분할
리듀싱과 요약
collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이
컬렉터의 최대 강점
//컬렉터로 메뉴에서 요리 수 계산
long howManyDishes = menu.stream().collect(Collectors.counting());
//더 간단히
long howManyDishes = menu.stream().count();
Collectors 클래스의 정적 팩토리 메서드를 모두 임포트했다고 가정
import static java.util.stream.Collectors.*; -> counting() 표현
6.2.1 스트림값에서 최댓값과 최솟값 검색
Collectors.maxBy,Collectors.minBy
Comparator<Dish> dishCaloriesComparator =
Comparator.comparingInt(Dish::getCalories);
Optional<Dish> mostCalorieDish =
menu.stream()
.collect(maxBy(dishCaloriesComparator));
스트림에 있는 객체의 숫자 필드의 합계나 평균 등을 반환하는 연산에도 리듀싱 기능이 자주 사용
=> 요약 연산
6.2.2 요약 연산
Collectors 클래스는 Collectors.summingInt
객체를 int로 매핑하는 함수를 인수로 받는다
Collectors.summingLong,Collectors.summingDouble 같은 방식으로 동작
평균값
averagingInt, averagingLong, averagingDouble 숫자 집합의 평균을 계산
1 2 3 4 5 6 7 | double avgCalories = menu.stream().collect(averagingInt(Dish::getCalories)); | cs |
두 개 이상의 연산을 한 번에 수행해야 할 때도 있다.
6.2.3 문자열 연결
컬렉터에 joining 팩토리 메서드를 이용하면 스트림의 각 객체에 toString 메서드를 호출해서 추출한 모든 문자열을 하나의 문자열로 연결해서 반환
구분 문자열을 넣을 수 있도록 오버로드된 joining 팩토리 메서드 리스트 콤마로 구분 가능
6.2.4 범용 리듀싱 요약 연산
범용 Collectors.reducing으로 구현 가능 -> 범용 팩토리 메서드 대신 특화된 컬렉터를 사용한 이유
-> 프로그래밍적 편의성 때문,가독성도 중요
1 2 3 4 5 6 | int totalCalories = menu.stream().collect(reducing( 0, Dish::getCalories, (i,j) -> i + j)); //첫 번쨰 인수 리듀싱 연산의 시작값이거나 스트림에 인수가 없을때는 반환값 //두 번째 인수 변환함수 //세 번째 인수 같은 종류의 두 항목을 하나의 값으로 더하는 BinaryOperator | cs |
6.3 그룹화
자바8의 함수형을 이용하면 가독성 있는 한 줄의 코드로 그룹화를 구현 가능
groupingBy 메서드 스트림이 그룹화되므로 분류 함수라고 부름
6.3.1 다수준 그룹화
groupingBy의 연산을 버킷(양동이) -> 각 키의 버킷을 만든후 준비된 각각의 버킷을 서브스트림 컬렉터로 채워감
6.3.2 서브 그룹으로 데이터 수집
분류 함수 한 개의 인수를 갖는 groupingBy(f)는 -> groupingBy(f, toList()) 축약형
댓글