Java 기본형 특화 Stream

김영한님의 김영한의 실전 자바 – 고급 3편, 람다, 스트림, 함수형 프로그래밍 내용 중 일부로 실무에서 자주 사용될 법한 기본형 특화 Stream의 종류들이다

기본형(primitive) 특화 스트림

  • Java Stream API에는 IntStream, LongStream, DoubleStream 같은 기본형 특화 스트림이 있다
  • 합계, 평균, 최솟값 최댓값 등 숫자 연산을 편리하게 제공하며, 오토박싱/언박싱을 중려 성능도 높일 수 있다

기본형 특화 스트림 생성(Int, Long, Double Stream)

IntStream stream = IntStream.of(1, 2, 3, 4, 5);

stream.forEach(i -> System.out.print(i + " ")); // 1 2 3 4 5

범위 생성 메서드

IntStream range = IntStream.range(1, 6); // 1부터 6번까지
range.forEach(i -> System.out.print(i + " ")); // 1 2 3 4 5 6

IntStream rangeClosed = IntStream.rangeClosed(1, 5); // 1부터 5까지
rangeClosed.forEach(i -> System.out.print(i + " ")); // 1 2 3 4 5

통계 관련 메서드(sum, average, max, min, count)

// sum - 합계
int sum = IntStream.range(1, 6).sum();
System.out.println("sum = " + sum); // sum = 15

// average - 평균
double avg = IntStream.range(1, 6).average().getAsDouble();
System.out.println("avg = " + avg); // avg = 3.0

// max - 최대값
int max = IntStream.range(1, 6).max().getAsInt();
System.out.println("max = " + max); // max = 5

// min - 최소값
int min = IntStream.range(1, 6).min().getAsInt();
System.out.println("min = " + min); // min = 1

// count - 개수
long count = IntStream.range(1, 6).count();
System.out.println("count = " + count); / count = 5

모든 통계 정보(summaryStatistics)

IntSummaryStatistics stats = IntStream.range(1, 6)
                .summaryStatistics();

System.out.println("합계: " + stats.getSum()); // 합계: 15
System.out.println("평균: " + stats.getAverage()); // 평균: 3.0
System.out.println("최대값: " + stats.getMax()); // 최대값: 5
System.out.println("최소값: " + stats.getMin()); // 최소값: 1
System.out.println("개수: " + stats.getCount()); // 개수: 5

타입 변화 메서드

IntStream ⭢ LongStream
LongStream longStream = IntStream.range(1, 6).asLongStream();
IntStream ⭢ DoubleStream
DoubleStream doubleStream = IntStream.range(1, 6).asDoubleStream();
IntStream ⭢ Stream<Integer>
Stream<Integer> boxedStream = IntStream.range(1, 6).boxed();

기본형 특화 매핑 mapToXXX()

int ⭢ long 변환 매핑
LongStream mappedToLong = IntStream.range(1, 6)
                .mapToLong(i -> i * 10);
int ⭢ double 변환 매핑
DoubleStream mappedToDouble = IntStream.range(1, 6)
                .mapToDouble(i -> i * 1.5);
int ⭢ 객체 변환 매핑
Stream<String> mappedToObj = IntStream.range(1, 6)
                .mapToObj(i -> "Number: " + i);
객체 스트림 ⭢ 기본형 특화 스트림으로 매핑
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);

IntStream intStream = integerStream.mapToInt(i -> i);
int intSum = intStream.sum();

System.out.println("intSum = " + intSum); // intSum = 15
객체 스트림 ⭢ 기본형 특화 스트림으로 매핑 활용
int result = Stream.of(1, 2, 3, 4, 5)
                .mapToInt(i -> i)
                .sum();
System.out.println("result = " + result); // result = 15
  • 기본형 특화 스트림(IntStream, LongStream, DoubleStream)은 합계, 평균, 최대값, 최소값 같은 연산을 편리하게 하고 박싱 / 언박싱 오버헤드를 줄여 성능상 이점이 있다
  • range(), rangeClosed()로 반복문을 대체할 수 있고,mapToXXX, boxed()로 객체 스트림과 자유롭게 변환할 수 있다
  • 성능을 for문 > 기본형 특화 스트림 > 일반 스트림 순이며, 실제 애플리케이션에서는 차이가 미미하므로 가독성과 유지보수성을 고려해 스트림을 사용하는 것이 일반적으로 더 낫다

출처 – 인프런 강의 중 김영한의 실전 자바 – 고급 3편, 람다, 스트림, 함수형 프로그래밍