본문 바로가기
프로그래밍/JAVA 내용정리

[MordernJavaInAction] 6장 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 모음.

by 노잼인간이라불립니다 2022. 10. 3.

이 글은 ModernJavaInAction이란 책을 읽고 요약 정리한 글 입니다.

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - toList()
 * 스트림의 모든 항목을 리스트로 수집
 */
@DisplayName("toList 사용법")
@Test
public void usingToList() {
    // when
    List<Dish> toList = menu.stream().collect(toList());

    // then
    System.out.println(toList); // [pork, beef, chicken, french fries, rice, season fruit, pizza, prawns, salmon]
    Assertions.assertThat(toList.size()).isEqualTo(9);
}


/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - toSet()
 * 스트림의 모든 항목을 중복이 없는 집합으로 수집
 */
@DisplayName("toSet 사용법")
@Test
public void usingToSet() {
    // when
    Set<Dish> toSet = menu.stream().collect(toSet());

    // then
    System.out.println(toSet); // [chicken, french fries, pork, salmon, prawns, season fruit, pizza, beef, rice]
    Assertions.assertThat(toSet.size()).isEqualTo(9);
}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - toCollection
 * 스트림의 모든 항목을 발행자가 제공하는 컬렉션으로 수집
 */
@DisplayName("toCollection 사용법")
@Test
public void usingToCollection() {
    // when
    ArrayList<Dish> toCollection =
            menu.stream()
                    .collect(toCollection(ArrayList::new));

    // then
    System.out.println(toCollection); // [pork, beef, chicken, french fries, rice, season fruit, pizza, prawns, salmon]
    Assertions.assertThat(toCollection.size()).isEqualTo(9);
}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - counting
 * 스트림의 항목 수 계산
 */
@DisplayName("counting 사용법")
@Test
public void usingCounting() {
    // when
    Long counting = menu.stream().collect(counting());

    // then
    System.out.println(counting); // 9
    Assertions.assertThat(counting).isEqualTo(9);
}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - summingInt
 * 스트림의 정수 프로퍼티 값을 더함
 */
@DisplayName("summingInt 사용법")
@Test
public void usingSummingInt() {
    // when
    Integer summingInt =
            menu.stream()
                    .collect(summingInt(Dish::getCalories));

    // then
    System.out.println(summingInt); // 4200
    Assertions.assertThat(summingInt).isEqualTo(4200);
}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - averagingInt
 * 스트림 항목의 정수 프로퍼티의 평균값 계산
 */
@DisplayName("averagingInt 사용법")
@Test
public void usingAveragingInt() {
    // when
    Double averagingInt =
            menu.stream()
                    .collect(averagingInt(Dish::getCalories));

    // then
    System.out.println(averagingInt); // 466.6666666666667
    Assertions.assertThat(averagingInt).isEqualTo(466.6666666666667);

}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - summarizingInt
 * 스트림 내 항목의 최댓값, 최솟값, 합계, 평균 등의 정수 정보 통계 수집
 */
@DisplayName("summarizingInt 사용법")
@Test
public void usingSummarizingInt() {
    // when
    IntSummaryStatistics summarizingInt =
            menu.stream()
                    .collect(summarizingInt(Dish::getCalories));

    // then
    System.out.println(summarizingInt); // IntSummaryStatistics{count=9, sum=4200, min=120, average=466.666667, max=800}
    Assertions.assertThat(summarizingInt.getCount()).isEqualTo(9);
    Assertions.assertThat(summarizingInt.getSum()).isEqualTo(4200);

}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - joining
 * 스트림의 각 항목에 toString 메서드를 호출한 결과 문자열 연결
 */
@DisplayName("joining 사용법")
@Test
public void usingJoining() {
    // when
    String joining =
            menu.stream()
                    .map(Dish::getName)
                    .collect(joining(", "));

    // then
    System.out.println(joining); // pork, beef, chicken, french fries, rice, season fruit, pizza, prawns, salmon

}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - maxBy
 * 주어진 비교자를 이용하여 스트림의 최댓값 요소를 Optional로 감싼 값을 반환, 스트림에 요소가 없을 때는 Optional.empty() 반환
 */
@DisplayName("maxBy 사용법")
@Test
public void usingMaxBy() {
    // when

    Dish dish = menu.stream()
            .collect(maxBy(Comparator.comparing(Dish::getCalories))).orElseThrow();

    // then
    System.out.println(dish.getCalories()); // 800
    Assertions.assertThat(dish.getCalories()).isEqualTo(800);

}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - reducing
 * 누적자를 초깃값으로 설정한 다음에 BinaryOperator로 스트림의 각 요소를 반복적으로 누적자와 합쳐 스트림을 하나의 값으로 리듀싱
 */
@DisplayName("reducing 사용법")
@Test
public void usingReducing() {
    // when
    Integer reducing =
            menu.stream()
                    .collect(reducing(0, Dish::getCalories, Integer::sum));

    // then
    System.out.println(reducing); // 4200
    Assertions.assertThat(reducing).isEqualTo(4200);

}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - collectingAndThen
 * 다른 컬렉터를 감싸고 그 결과에 변환 함수 적용.
 */
@DisplayName("CollectingAndThen 사용법")
@Test
public void usingCollectingAndThen(){
    // when
    Integer collectingAndThen =
            menu.stream()
                    .collect(collectingAndThen(toList(), List::size));

    // then
    System.out.println(collectingAndThen); // 9
    Assertions.assertThat(collectingAndThen).isEqualTo(9);


}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - groupingBy
 * 하나의 프로퍼티 값을 기준으로 스트림의 항목을 그룹화 하며 기준 프로퍼티값을 결과 맵의 키로 사용.
 */
@DisplayName("groupingBy 사용법")
@Test
public void usingGroupingBy(){
    // when
    Map<Type, List<Dish>> groupingBy =
            menu.stream().collect(groupingBy(Dish::getType));

    // then
    System.out.println(groupingBy);
    /* 결과 값
    {
    OTHER=[french fries, rice, season fruit, pizza],
    MEAT=[pork, beef, chicken],
    FISH=[prawns, salmon]
    }
    */

}

/**
 * 표 6-1 Collectors 클래스의 정적 팩토리 메서드 사용법 예제 - partitioningBy
 * 프레디케이트를 스트림의 각 항목에 적용한 결과로 항목 분할
 */
@DisplayName("partitioningBy 사용법")
@Test
public void usingParitioningBy(){
    // when
    Map<Boolean, List<Dish>> partitioningBy =
            menu.stream().collect(partitioningBy(Dish::isVegetarian));

    // then
    System.out.println(partitioningBy);
    /* 결과 값
     * {
     * false=[pork, beef, chicken, prawns, salmon],
     * true=[french fries, rice, season fruit, pizza]
     * }
     */

}

 

 

참고

모던자바인액션