본문 바로가기
개발/JAVA

JAVA8 IN Action Chapter6 요점정리

by 밥버검 2018. 12. 5.
반응형

스트림으로 데이터 수집


Collectors 클래스로 컬렉션을 만들고 사용하기


하나의 값으로 데이터 스트림 리듀스하기 

특별한 리듀싱 요약 연산

데이터 그룹화와 분할

자신만의 커스텀 컬렉터 개발

자바8의 스트림이란 데이터 집합을 멋지게 처리하는 게으른 반복자라고 생각

collect와 컬렉터로 구분



컬렉터 


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()) 축약형




반응형

댓글