이 글은 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]
* }
*/
}
참고
모던자바인액션
'프로그래밍 > JAVA 내용정리' 카테고리의 다른 글
[ModernJavaInAction] 7장 병렬스트림 정리 1편 (0) | 2022.10.10 |
---|---|
[MordernJavaInAction] 6장 스트림으로 데이터 수집(Stream Collector) 2편. (0) | 2022.10.03 |
[MordernJavaInAction] 6장 스트림으로 데이터 수집(Stream Collector) 1편. (0) | 2022.09.25 |
[ModernJavaInAction] 5장 스트림의 활용 (1) | 2022.09.12 |
[Java] Atomic Integer에 대하여. (0) | 2022.08.28 |