김영한님의 김영한의 실전 자바 – 고급 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문 > 기본형 특화 스트림 > 일반 스트림 순이며, 실제 애플리케이션에서는 차이가 미미하므로 가독성과 유지보수성을 고려해 스트림을 사용하는 것이 일반적으로 더 낫다