728x90
반응형
SMALL
스트림 API에는 기본형 특화 스트림이 존재한다. 자바에서는 IntStream, LongStream, DoubleStream 세 가지 형태를 제공하여 기본 자료형에 특화된 기능을 사용할 수 있게 한다.
예를 들어, IntStream은 합계 계산, 평균, 최솟값, 최댓값 등 정수와 관련된 연산을 좀 더 편리하게 제공하고, 오토박싱, 언박싱 비용을 줄여 성능도 향상시킬 수 있다.
기본형 특화 스트림의 종류
스트림 타입 | 대상 원시 타입 | 생성 예시 |
IntStream | int | IntStream.of(1, 2, 3), IntStream.range(1, 10), mapToInt(...) |
LongStream | long | LongStream.of(10L, 20L), LongStream.range(1, 10), mapToLong(...) |
DoubleStream | double | DoubleStream.of(3.14, 2.78), DoubleStream.generate(Math::random), mapToDouble(...) |
기본형 특화 스트림의 숫자 범위 생성 기능
- range(int startInclusive, int endExclusive): 시작값 이상, 끝 값 미만
- rangeClosed(int startInclusive, int endInclusive): 시작값 이상, 끝 값 포함
주요 기능 및 메서드
기본형 특화 스트림은 합계, 평균 등 자주 사용하는 연산을 편리한 메서드로 제공한다. 또한 타입 변환과 박싱/언박싱 메서드도 제공하여 다른 스트림과 연계해 작업하기 수월하다.
참고로, 기본형 특화 스트림은 int, long, double 같은 숫자를 사용한다. 따라서 숫자 연산에 특화된 메서드를 제공할 수 있다.
메서드/기능 | 설명 | 예시 |
sum() | 모든 요소의 합계를 구한다. | int total = IntStream.of(1,2,3).sum(); |
average() | 모든 요소의 평균을 구한다. | double avg = IntStream.range(1, 5).average().getAsDouble(); |
summaryStatistics() | 최솟값, 최댓값, 합계, 개수, 평균 등이 담긴 객체 변환 | IntSummaryStatistics stats = IntStream.range(1, 5).summaryStatistics(); |
mapToLong(), mapToDouble(), mapToInt() | 타입 변환: IntStream -> LongStream, DoubleStream | LongStream ls = IntStream.of(1, 2).mapToLong(i -> i * 10L); |
mapToObj() | 객체 스트림으로 변환: 기본형 -> 참조형 | Stream<String> s = IntStream.range(1, 5).mapToObj(i -> "No: " + i); |
boxed() | 기본형 특화 스트림을 박싱된 객체 스트림으로 변환 | Stream<Integer> si = IntStream.range(1, 5).boxed(); |
sum(), min(), max(), count() | 합계, 최소값, 최대값, 개수를 반환 | long cnt = LongStream.of(1,2,3).count(); |
예시 코드
package stream.operation;
import java.util.IntSummaryStatistics;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.Stream;
public class PrimitiveStreamMain {
public static void main(String[] args) {
// 기본형 특화 스트림 (IntStream, LongStream, DoubleStream)
IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
intStream.forEach(i -> System.out.print(i + " "));
System.out.println();
// 범위 생성 메서드
IntStream range1 = IntStream.range(1, 6); // [1,2,3,4,5]
IntStream range2 = IntStream.rangeClosed(1, 6); // [1,2,3,4,5,6]
range1.forEach(i -> System.out.print(i + " "));
System.out.println();
range2.forEach(i -> System.out.print(i + " "));
System.out.println();
// 통계 관련 메서드
int sum = IntStream.range(1, 6).sum();
System.out.println("sum = " + sum);
double avg = IntStream.range(1, 6).average().getAsDouble();
System.out.println("avg = " + avg);
IntSummaryStatistics stats = IntStream.range(1, 6).summaryStatistics();
System.out.println("합계: " + stats.getSum());
System.out.println("평균: " + stats.getAverage());
System.out.println("최댓값: " + stats.getMax());
System.out.println("최소값: " + stats.getMin());
System.out.println("개수: " + stats.getCount());
// 타입 변환 메서드
LongStream longStream = IntStream.range(1, 5).asLongStream();
DoubleStream doubleStream = IntStream.range(1, 5).asDoubleStream();
Stream<Integer> boxed = IntStream.range(1, 5).boxed();
// 기본형 특화 매핑
LongStream mappedToLong = IntStream.range(1, 5).mapToLong(i -> i * 10L);
DoubleStream mappedToDouble = IntStream.range(1, 5).mapToDouble(i -> i * 1.5);
Stream<String> mappedToObj = IntStream.range(1, 5).mapToObj(i -> "Number " + i);
// 객체 스트림 -> 기본형 특화 스트림으로 매핑
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
IntStream intStream2 = integerStream.mapToInt(i -> i);
int sum2 = intStream2.sum();
System.out.println("sum2 = " + sum2);
}
}
어디다가 써요?
- 예를 들어, 기본 스트림을 사용하는데 전부 데이터가 숫자이고 이 합계를 구하고 싶다면 다음 코드가 가장 사용하기 좋은 예시가 된다.
// 객체 스트림 -> 기본형 특화 스트림으로 매핑
int newSum = Stream.of(1, 2, 3, 4, 5)
.mapToInt(i -> i)
.sum();
System.out.println("newSum = " + newSum);
- 또 다른 예로, range(), rangeClosed() 같은 메서드를 사용하면 범위를 쉽게 다룰 수 있어 반복문 대신에 자주 사용된다.
- summaryStatistics()를 이용하면 합계, 평균, 최소값, 최대값 등 통계 정보를 한번에 구할 수 있어 편리하다.
728x90
반응형
LIST
'JAVA의 가장 기본이 되는 내용' 카테고리의 다른 글
Optional - 값 획득, 값 처리 방식 (0) | 2025.04.01 |
---|---|
Stream API - 컬렉터, 다운 스트림 컬렉터 (0) | 2025.03.31 |
takeWhile, dropWhile, flatMap - Stream API (0) | 2025.03.31 |
람다 vs 익명 클래스 (0) | 2025.03.30 |
람다가 필요한 이유 (0) | 2025.03.28 |