기본 집계


집계(Aggregate)는 최종 처리 기능으로 요소들을 처리해서 카운팅, 합계, 평균값, 최대값, 최소값 등과 같이 하나의 값으로 산출하는 것을 말한다. 집계는 대량의 데이터를 가공해서 축소하는 리덕션(Reduction)이라고 볼 수 있다.



1. 스트림이 제공하는 기본 집계


리턴 타입 메소드(매개 변수) 설명
long count() 요소 개수
OptionalXXX findFirst() 첫 번째 요소
Optional<T>
OptionalXXX
max(Comparator<T>)
max()
최대 요소
Optional<T>
OptionalXXX
min(Comparator<T>)
min()
최소 요소
OptionalDouble average() 요소 평균
int, long, double sum() 요소 총합



이 집계 메소드에서 리턴하는 OptionalXXX 는 자바 8에서 추가한 java.util 패키지의 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스 타입을 말한다. 이들은 값을 저장하는 값 기반 클래스(value-based class)들이다. 이 객체에서 값을 얻기 위해서는 get(), getAsDouble(), getAsInt(), getAsLong() 을 호출하면 된다.


import java.util.Arrays;

public class AggregateExample {
  public static void main(String[] args){
    long count = Arrays.stream(new int[] {1, 2, 3, 4, 5});
      .filter(n -> n%2 == 0)
      .count();
    System.out.println("2의 배수 개수: " + count);

    long sum = Arrays.stream(new int[] {1, 2, 3, 4, 5})
      .filter(n -> n%2 == 0)
      .sum();
    System.out.println("2의 배수의 합: " + sum);

    double avg = Arrays.stream(new int[] {1, 2, 3, 4, 5})
      .filter(n -> n%2 ==0)
      .average()
      .getAsDouble();
    System.out.println("2의 배수의 평균: " + avg);

    int max = Arrays.stream(new int[] {1, 2, 3, 4, 5})
      .filter(n -> n%2 == 0)
      .max()
      .getAsInt();
    System.out.println("최대값" + max);

    int min = Arrays.stream(new int[] {1, 2, 3, 4, 5})
      .filter(n -> n%2 == 0)
      .min()
      .getAsInt();
    System.out.println("최소값" + min);

    int first = Arrays.stream(new int[] {1, 2, 3, 4, 5})
      .filter(n -> n%3 == 0)
      .findFirst()
      .getAsInt();
    System.out.println("첫번째 3의 배수: " + first);
  }
}