커스텀 집계()
스트림은 기본 집계 메소드인 sum(), average(), count(), max(), min() 을 제공하지만,
프로그램화해서 다양한 집계 결과물을 만들 수 있도록 reduce() 메소드도 제공한다.
각 인터페이스에는 매개 타입으로 XXXOperator, 리턴 타입으로 OptionalXXX, int, long, double 을 가지는 reduce() 메소드가 오버로딩 되어있다.
스트림에 요소가 전혀 없을 경우 디폴트 값인 identity 매개값이 리턴된다.
XXXOperator 매개값은 집계 처리를 위한 람다식을 대입하는데,
예를들어 학생들의 성적 총점은 학생 스트림에서 점수 스트림으로 매핑해서 다음과 같이 얻을수 있다
int sum = studentList.stream().map(Student::getScore).reduce((a,b)-> a+b).get
int sumt = studentList.stream().map(Student :: getScore).reduce(0, (a,b) -> a+b);
1 코드는 스트림에 요소가 없을 경우 NoSuchElementException이 발생하지만 ,
2 코드는 디폴트 값 (identity)인 0을 리턴한다.
스트림에 요소가 있을 경우에는 두 코드 모두 동일한 결과를 산출한다.
package Stream;
import java.util.Arrays;
import java.util.List;
public class ReductionExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(new Student("홍길동", 91),
new Student("제길동", 94),
new Student("애길동", 93));
// 방법 1 sum()
int sum1 = studentList.stream().mapToInt(Student::getScore).sum();
// 방법 2 reduce()
int sum2 = studentList.stream().map(Student :: getScore).reduce((a,b)-> a+b).get();
// 방법 3 reduce()
int sum3 = studentList.stream().map(Student :: getScore).reduce(0, (a,b)-> a+b);
System.out.println("sum1 : " + sum1);
System.out.println("sum2 : " + sum2);
System.out.println("sum3 : " + sum3);
}
}
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
병렬 처리 (0) | 2022.09.29 |
---|---|
수집(collect()) (1) | 2022.09.22 |
기본 집계(sum(), count(), average(), max(), min()) (0) | 2022.06.03 |
루핑(peek(), forEach()), 매칭 (allMatch(), anyMatch(), noneMatch()) (0) | 2022.06.02 |
필터링(distinct(), filter()), 매핑(mapXXX), 정렬(sorted) (0) | 2022.05.30 |