HOME > java > java8

Java8 - SummaryStatistics 예제

JSFollow03 Oct 2019

SummaryStatistics는 count, min, max, sum average 등의 statistics 정보를 계산해주는 클래스입니다. 그리고 스트림과 함께 사용할 수 있도록 디자인하였습니다.

Int, Long, Double의 자료형과 함께 사용할 수 있습니다. 다음과 같이 자료형마다 클래스 이름이 다릅니다.

  • IntSummaryStatistics
  • LongSummaryStatistics
  • DoubleSummaryStatistics

IntSummaryStatistics 예제

스트림과 함께 IntSummaryStatistics를 사용해보겠습니다. 아래 코드를 보시면 먼저 리스트를 스트림으로 만들고, 문자열의 length(Int)로 변환했습니다. 그리고 이 스트림에 대해서 summaryStatistics()로 statistics 객체를 생성했습니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();

System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());

위의 코드처럼 생성된 stats 객체에서 max, min, average, count 정보를 가져올 수 있습니다.

실행 결과는 다음과 같습니다.

Max: 10
Min: 4
Average: 6.2
Count: 5

메소드 이름에서 추측할 수 있듯이 각각 다음과 같은 값들을 리턴해줍니다.

  • IntSummaryStatistics.getMax() : 최대값을 리턴
  • IntSummaryStatistics.getMin() : 최소값을 리턴
  • IntSummaryStatistics.getAverage() : 평균값을 리턴
  • IntSummaryStatistics.getCount() : 스트림의 아이템 전체 개수를 리턴

IntSummaryStatistics.accept()

accept()는 IntSummaryStatistics 객체에 새로운 아이템을 추가하는 메소드입니다. 아래 코드에서 accept 메소드로 20을 추가했고, 결과를 보면 20까지 포함하여 계산된 statistics가 출력되었습니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();
stats.accept(20);

System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());

결과는 다음과 같습니다.

Max: 20
Min: 4
Average: 8.5
Count: 6

IntSummaryStatistics.combine()

combine은 두개의 statistics 객체를 합치는 메소드입니다. 아래 코드를 보시면 stats, stats2 객체를 생성하였고 combine()으로 두개의 객체를 합쳤습니다. 결과를 보면 두 객체가 포함하는 모든 아이템들로 다시 계산된 statistics가 출력되었습니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats = langs.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();

List<String> companies =
        Arrays.asList("google", "apple", "google", "apple", "samsung");
IntSummaryStatistics stats2 = companies.stream()
                                  .mapToInt((lang) -> (lang.length()))
                                  .summaryStatistics();

stats.combine(stats2);

System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());

결과는 다음과 같습니다.

Max: 10
Min: 4
Average: 6.0
Count: 10

Collectors.summarizingInt를 이용한 예제

collectCollectors.summarizingInt를 이용하면 summaryStatistics()를 사용하지 않고 SummaryStatistics 객체를 만들 수 있습니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "javascript");
IntSummaryStatistics stats =
    langs.stream()
         .collect(Collectors.summarizingInt(String::length));

         System.out.println("Max: " + stats.getMax());
         System.out.println("Min: " + stats.getMin());
         System.out.println("Average: " + stats.getAverage());
         System.out.println("Count: " + stats.getCount());

실행 결과는 다음과 같습니다.

Max: 10
Min: 4
Average: 6.2
Count: 5

LongSummaryStatistics, DoubleSummaryStatistics 예제

위의 IntSummaryStatistics 예제와 자료형만 다를 뿐 구현 방법은 동일합니다.

참고