int, double 등 기본 자료형에 특화된 스트림이다. 이를 사용하면 유의미한 성능 차이가 있는 건 아니지만, 그래도 성능과 가시성에 있어서 장점을 보인다. 숫자 연산일 경우 사용하면 좋다.
스트림의 종류로는 IntStream, LongStream, DoubleStream이 있다.
둘 다 범위를 정하는 메서드로, 범위를 정해주는 두 수를 매개변수로 받는다. 다만, 범의 끝을 알려주는 두 번째 매개변수를 rangeClosed()는 포함하지만, range()는 포함하지 않는다는 차이가 있다. 그러니까 1과 5를 인자로 넣었을 때 range는 1~4만 반환하지만, rangeClosed는 1~5를 반환한다.
int sum1 = IntStream.rangeClosed(1, 10)
요소들의 합계를 반환한다.
int sum2 = IntStream.of(10, 20, 30, 40, 50).sum();
System.out.println("지정한 숫자들의 합: " + sum2);
요소들의 평균을 반환한다. 결과 없을 수 있으므로 Optional을 반환한다.
IntStream stream = IntStream.rangeClosed(1, 10);
// average() 메서드는 OptionalDouble을 반환
OptionalDouble optionalDouble = stream.average();
// OptionalDouble에 값이 있는지 확인하고 출력
if (optionalDouble.isPresent()) {
double average = optionalDouble.getAsDouble();
System.out.println("1부터 10까지의 평균: " + average); // 출력: 5.5
} else {
System.out.println("평균을 계산할 수 없습니다.");
}
앞에 기본형을 붙여서 총합, 평균, 최댓값, 최솟값 등 모든 통계 정보를 반환한다.
IntStream numbers = IntStream.of(10, 20, 30, 40, 50);
// summaryStatistics()를 호출하여 통계 객체를 얻음
IntSummaryStatistics stats = numbers.summaryStatistics();
// 결과 출력
System.out.println("전체 통계 객체: " + stats);
System.out.println("-------------------------");
System.out.println("개수 (count): " + stats.getCount());
System.out.println("합계 (sum): " + stats.getSum());
System.out.println("최소값 (min): " + stats.getMin());
System.out.println("최대값 (max): " + stats.getMax());
System.out.println("평균 (average): " + stats.getAverage());
mapTo... 뒤에 기본형 타입을 붙여 그 타입으로 변환시킨다.
LongStream ls = IntStream.of(1,2).mapToLong(i i * 10L);
객체 스트림으로 변환시킨다. 기본형에서 참조형으로 바뀌는 거다. 아래 같은 경우는 IntSream이 String으로 Obj를 거쳐 String으로 스트림에 담기는 것이다.
Stream<String> s = IntStream.range(1,5).mapToObj(i "No: "+i);
기본형 특화 스트림을 박싱된 객체 스트림으로 변환한다. 반대로 객체 스트림에서 기본형 특화 스트림으로 변환시키려면 mapToXxx을 사용하면 된다.
Stream<Integer> si = IntStream.range(1,5).boxed();
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
IntStream intStream = integerStream.mapToInt(i -> i);
각각 요소들의 최솟값, 최댓값, 갯수를 반환한다.
as 뒤에 기본형 타입이 붙어 그 기본형 타입 특화 스트림으로 변환시킨다.
LongStream longStream = IntStream.range(1, 5).asLongStream();