You will be fine

<Lambda> 6. JAVA8 in Action - Chapter 6

by BFine
반응형

JAVA8 in Action - part2

Chapter 6 - 스트림으로 데이터 수집

6.1.0 정리

  • 중간연산 은 한 스트림을 다른 스트림으로 변환하는 연산으로 여러 연산을 연결 할 수 있다.
  • 최종연산 은 스트림의 요소를 소비해 최종 결과 를 도출한다.

6.1.1 컬렉터란 무엇인가

  • 함수형 프로그래밍에서는 무엇을 원하는지 직접 명시할 수 있어서 방법을 신경 쓸 필요가 없다.
  • 함수형 API 장점은 조합성재사용성
  • 데이터들을 가로로 된 스트림이라는 통에 집어넣고 세로로 연산을 수행해 결과를 추출해서 자료구조에 저장해둔다.

6.1.2 미리 정의된 컬렉터

  • Collectors 에서 제공하는 메서드 기능
    • 스트림 요소를 하나의 값으로 리듀스하고 요약
    • 요소 그룹화
    • 요소 분할

6.2.0 리듀싱과 요약

  • 컬렉터 로 스트림의 항목을 컬렉션으로 재구성 할 수 있다.

6.2.1 스트림값에서 최댓값 최소값 검색

  • Collectors 클래스에는 maxBy , minBy 개의 메서드가 있다.

6.2.2 요약 연산

  • summingInt, averagingInt 는 객체를 int로 매핑하는 함수를 인수로 받아 값을 구하는 메서드 이다.
  • 합계, 평균, 최댓값 등 두개 이상의 연산을 한번에 해야할 경우 summarizingInt 메서드를 지원한다.
  • summarizingInt 메서드는 반환값으로 IntSummaryStatistics 클래스를 값으로 받는다.

6.2.3 문자열 연결

  • joining 메서드를 이용하면 각 객체에 toString 메서드를 호출해서 하나의 문자열로 연결 해서 반환한다.
  • joining 메서드는 StringBuilder 를 이용해서 문자열을 하나로 만든다.

6.2.4 범용 리듀싱 요약연산

  • reducing은 초기값, 내부값, Operator 세가지를 인수로 제공받는다. (초기값을 없어도 가능)
  • reduce 메서드를 잘못 사용하면 여러 스레드가 동시 점유로 인해 병렬로 수행할 수 없다.
  • 병렬처리 가 필요한 경우는 collet 메서드를 쓰는 것이 좋다.
  • collet 는 결과를 누적하는 컨테이너를 변경, reduce 는 두값을 하나로 도출하는 불변형 연## NOTE : 제네릭 와일드카드 ? 는 형식의 자유로움을 의미한다.

6.3.0 그룹화

  • 데이터 집합을 하나이상의 특성으로 분류해 그룹화 하는 연산
  • groupingBy 으로 그룹화 할 수 있다.
  • 함수를 기준으로 스트림이 그룹화 되기때문에 분류함수 라고 부른다.
  • 분류기준(>,<) 같이 복잡하는 것은 람다로직으로 구현한다. NOTE : 함수는 독립적으로 존재하는 것을 의미하고 메서드는 클래스에 종속된 것을 의미한다.
    Map<Dish.Type,List<Dish>> d = menu.stream()
                                      .collect(groupingBy(Dish::getType));
                                      // Dish.Type은 eum형태

6.3.1 다수준 그룹화

  • groupingBy 는 분류함수와 컬렉터를 인수로 받는다. (분류함수가 먼저 실행)
  • groupingBy 는 스트림의 첫번째요소를 찾은 이후에 그룹화 맵에 추가한다.
  • collectingAndThen 으로 컬렉터가 반환한 결과를 다른 형식으로 활용할 수 있다.
  • 리듀싱 작업을 할때는 groupingBy 에 두번째 인수로 전달한 컬렉터를 사용한다.(summingInt)
  • mapping 은 변환함수(표시)와 결과 객체를 누적하는 컬렉터를 인수로 받는다.
    Map<Dish.Type, Dish> map =
            menu.stream()
              .collect(
                groupingBy(Dish::getType,
                collectingAndThen(
                  minBy(Comparator.comparingInt(Dish::getCalories)),
                  Optional::get)));
        // collectingAndThen는 인수로 Comparator, 결과 두개를 받는다.
      // Type으로 분류-> 각각의 서브스트림 -> collectingAndThen

6.4.0 분할

  • 분할은 분할 함수라 불리는 프레디케이트를 분류 함수로 사용하는 특수한 그룹화 기능이다.

6.4.1 분할의 장점

  • 참 거짓 두가지 요소의 스트림 리스트를 모두 유지하는 것이 분할의 장점이다.
  • partitioningBy 는 프리디케이트 & 컬렉터를 인수로 받는다.
    Map<Boolean,List<Dish>> map
      = menu.stream()
          .collet(partitioningBy(Dish::isVegetarian),groupingBy(Dish::getType));

6.5.0 Collector 인터페이스

  • Collector 인터페이스는 리듀싱 연산을 어떻게 구현할지 제공하는 메서드 집합으로 구성
  • Collector<T,A,R> 에서 T는 수집될 항목, A는 누적자(중간결과 누적), R은 연산결과 객체형태
  • 누적과정에서 사용되는 객체가 수집과정의 최종결과로 사용

6.5.1 Collector 인터페이스 메서드 살펴보기

  • collect 메서드에서 실행하는 함수를 반환하는 메서드
    • supplier 는 빈누적자 인스턴스를 만드는 파라미터가 없는 함수
    • accumulator 는 리듀싱 연상을 수행하는 함수를 반환
    • finisher 는 누적자 객체를 최종 결과로 변환하면서 누적과정을 끝낼때 호출할 함수를 반환
    • combiner는 서로 다른 서브 스트림을 병렬로 처리할 때 누적자가 판단하여 병합한다
  • Charaterisitic 메서드는 컬렉터의 연산을 정의하는 Charaterisitic 형식의 불변 집합을 반환한다.

출처

  • Java8 in Action


반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기