Java - SummaryStatistics 사용 방법 (count, min, max, average)

Java 8에서 도입된 SummaryStatistics는 count, min, max, sum average 등의 statistics 정보를 계산해주는 클래스입니다. 그리고 스트림과 함께 사용할 수 있습니다.

SummaryStatistics는 Int, Long, Double 자료형을 지원하는 아래 클래스들을 사용할 수 있습니다. 아래와 같이 지원하는 자료형마다 클래스 이름이 다릅니다만, 사용 방법은 모두 동일합니다.

  • IntSummaryStatistics
  • LongSummaryStatistics
  • DoubleSummaryStatistics

이 글에서는 SummaryStatistics의 기본적인 사용 방법 및 예제를 알아보겠습니다.

1. IntSummaryStatistics

아래 예제는 Stream에서 IntSummaryStatistics를 사용하는 예제입니다.

아래 예제를 보시면, Stream은 문자열을 요소로 전달하는데 mapToInt()로 String을 Int로 변환했습니다. 그리고 이 스트림에 대해서 summaryStatistics()로 statistics 객체를 생성했습니다.

SummaryStatistics는 아래와 같이 getMax(), getMin(), getAverage(), getCount() 등의 함수를 제공하여 쉽게 최대 값, 최소 값, 평균 등을 계산할 수 있습니다.

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());

Output:

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

SummaryStatistics의 함수 이름에서 알 수 있듯이 다음과 같은 값들을 리턴해줍니다.

  • IntSummaryStatistics.getMax() : 최대값 리턴
  • IntSummaryStatistics.getMin() : 최소값 리턴
  • IntSummaryStatistics.getAverage() : 평균값 리턴
  • IntSummaryStatistics.getCount() : 요소들의 전체 개수 리턴

2. IntSummaryStatistics.accept()

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

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());

Output:

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

3. IntSummaryStatistics.combine()

combine()은 두개의 statistics 객체를 합치는 함수입니다.

아래 코드를 보시면 stats, stats2 객체를 생성하였고 combine()으로 두개의 객체를 합쳤습니다. 결과를 보면 두 객체의 결과들로 다시 계산된 결과들이 출력되었습니다.

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());

Output:

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

4. Collectors.summarizingInt()로 SummaryStatistics 생성

collect() 함수와 Collectors.summarizingInt()를 이용하여 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());

Output:

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

5. LongSummaryStatistics, DoubleSummaryStatistics 의 사용 방법

위의 IntSummaryStatistics 예제와 클래스 이름만 다를 뿐 구현 방법은 동일합니다.

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha