sum(), count(), average(), max(), min()
집계(Aggregate) 는 최종 처리 기능이며, 요소들을 처리한 후 카운팅, 합계, 평균값, 최대값, 최소값 등과 같이 하나의 값으로 산출하는 것을 말한다.
=> 대량의 데이터를 가공해서 축소하는 리덕션(Reduction)이라고 볼 수 있다.
스트림에서 제공하는 기본 집계
집계 메서드에서는 리턴 값으로 OptionalXXX클래스를 리턴한다.
OptionalXXX는 자바8 java.util 패키지의 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스타입을 말한다. (value-based class)
이 객체에서 값을 얻기 위해서는 get(), getAsDouble(), getAsInt(), getAsLong()을 호출하면 된다.
public static void main(String[] args){
int[] intArr = {1, 2, 3, 4, 5};
// count() 요소 개수 반환
long count = Arrays.stream(intArr)
.filter(n -> n%2 == 0)
.count();
System.out.println(count);
// sum() 요소 총합 반환
long sum = Arrays.stream(intArr)
.filter(n -> n%2 == 0)
.sum();
System.out.println(sum);
// average() 요소 평균 반환
double avg = Arrays.stream(intArr)
.filter(n -> n%2 == 0)
.average()
.getAsDouble();
System.out.println(avg);
// max() 최대값 반환
int max = Arrays.stream(intArr)
.filter(n -> n%2 == 0)
.max()
.getAsInt();
System.out.println(max);
// min() 최소값 반환
int min = Arrays.stream(intArr)
.filter(n -> n%2 == 0)
.min()
.getAsInt();
System.out.println(min);
// findFirst() 첫 번째 요소 반환
int first = Arrays.stream(intArr)
.filter(n -> n%2 == 0)
.findFirst()
.getAsInt();
System.out.println(first);
}
Optional 클래스
Optional 클래스는 단순히 집계값만 저장하는 것이 아니라, 집계값이 존재하지 않을 경우 디폴트 값을 설정 할 수 있고, 집계 값을 처리하는 Consumer도 등록 할 수 있다.isPresent()
=> 값이 저장되어 있는지 여부orElse(...)
=> 값이 저장되어 있지 않을 경우 디폴트 값 지정ifPresent(Consumer ...)
=> 값이 저장되어 있을 경우 Consumer에서 처리
List<Integer> list = new ArrayList<>();
double avg = list.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
System.out.println("평균 : " + avg);
만약 위처럼 collection의 요소(element)가 하나도 들어 있지 않으면 예외가 발생하게 된다. (NoSuchElementException)
예외를 피하기 위해 위에 작성된 세가지 메소드(isPresent(), orElse(), ifPresnet)를 사용할 수 있다.
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
// 예외 발생
/*
double avg = list.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();*/
// isPresent() 사용
OptionalDouble optional = list.stream()
.mapToInt(Integer::intValue)
.average();
if(optional.isPresent()){
System.out.println("평균 : " + optional.getAsDouble());
}else{
System.out.println("xxx");
}
// orElse() 사용, 디폴트 값을 지정
double avg = list.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0);
System.out.println("평균 : " + avg);
// ifPresent() 사용, 존재할시만 출력
list.stream()
.mapToInt(Integer::intValue)
.average()
.ifPresent(data -> System.out.println("평균 : " + data));
}
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] java.util.function FunctionalInterface(함수적 인터페이스) 종류 (0) | 2019.06.30 |
---|---|
[JAVA] Stream 커스텀 집계 (0) | 2019.06.30 |
[JAVA] Stream Looping(루핑, peek(), forEach()) (0) | 2019.06.17 |
[JAVA] Stream 정렬(sorted()) (0) | 2019.06.17 |
[JAVA] Stream 매핑(flatMapXXX(), mapXXX(), asXXXStream(), boxed()) (0) | 2019.06.17 |