1. 기본형 특화 스트림
이전에 함수형 인터페이스에서 오토 박싱에 대한 내용을 다루었습니다. 리듀스 연산 역시 오토 박싱이 숨어 있습니다!
이에 대한 비용처리 대책도 존재합니다. 기본형 특화 방식이 존재합니다.
숫자 스트림
기본형 숫자형 특화 스트림은 Stream<T>가 아닌 IntStream, DoubleStream, LongStream이 있습니다!
이 숫자 특화 스트림으로 변환을 할 때는 다음 세 메서드를 가장 많이 사용합니다.
메서드 | 기능 |
mapToInt( ) | 기본적으로 map과 같은 기능 수행, Stream<Integer>이 아닌 IntStream 반환 |
mapToDouble( ) | 기본적으로 map과 같은 기능 수행, Stream<Double>이 아닌DoubleStream 반환 |
mapToLong( ) | 기본적으로 map과 같은 기능 수행, Stream<Long>이 아닌 LongStream 반환 |
일반 스트림으로 복원
숫자형 특화 스트림으로 변환하여 연산한 다음 다시 일반 스트림(Stream 등)으로 복원(박싱)을 해야 합니다.
이럴때는 'boxed( )' 메서드를 사용하면 됩니다.
Stream<Integer> stream1 = intStream.boxed();
Stream<Double> stream2 = doubleStream.boxed();
Stream<Long> stream3 = longStream.boxed();
기본값 : OptionalInt
만약 스트림 연산 결과가 null이면 어떻게 해야 할까?
이런 경우를 대비하기위해서 만들어진 Optional<T>을 얘기한 적이 있습니다. 하지만 이는 또 박싱과 언박싱 자원을 소모해야 한다. 이를 기본형 특화 스트림에도 적용이 가능합니다.
OptionalInt, OptionalDouble, OptionalLong
이제 이 타입들의 orElse(기본값)을 이용해서 값이 없을 때 사용할 기본값을 명시적으로 정의 가능합니다.
숫자 범위
특정 범위의 숫자를 이용해야 하는 상황이 자주 발생합니다. (ex: 1~100 생성)
이런 경우 숫자형 스트림에서는(IntStream, LongStream) range(start, end), rangeClosed(start, end) 메서드를 지원합니다.
메서드 | 설명 |
range(start, end) | 결과에 시작값과 종료값이 포함되지 않음. |
rangeCloesd(start, end) | 결과에 시작값과 종료값이 포함됨. |
2. 함수로 무한 스트림 만들기
무한 스트림이란, 크기가 딱히 고정되지 않은 스트림을 말합니다.
요청마다 주어진 함수를 이용해 무제한으로 값을 계산할 수 있다는 뜻입니다!
함수에서 스트림을 만들 수 있는 두 정적 메서드 'Stream.iterate', 'Stream.generate'을 제공합니다.
무한으로 계산을 하기 때문에, 반드시 'limit( )'를 두어 제한을 명시해야 합니다!
1. Stream.iterate( )
private static void iterateStream() {
Stream.iterate(0, n -> n + 2) // 초기값, 함수
.limit(10) // 여기서는 제한을 두었으나, 없으면 무한계산
.forEach(System.out::println);
}
초기값과 함수가 파라미터로 들어갑니다.
'iterate( )' 메서드는 특히 연속적인 수(규칙적인 수)를 표현할 때 사용됩니다.
2. Stream.generate( )
연속적이지 않은 수 특히 난수를 생성할 때 잘 사용되는 메서드입니다.
private static void streamGenerate() {
Stream.generate(Math::random)
.limit(10)
.forEach(System.out::println);
}
이 메서드를 어디 써먹느냐 하겠지만 나중에 설명할 병렬 스트림에서 사용이 됩니다!
참고 자료
- 모던 자바 인 액션
- JAVA Reference
'JAVA > 모던 자바 인 액션' 카테고리의 다른 글
모던 자바 인 액션 13. 스트림을 이용한 데이터 수집(2) (0) | 2021.08.20 |
---|---|
모던 자바 인 액션 12. 스트림을 이용한 데이터 수집(1) (0) | 2021.08.20 |
모던 자바 인 액션 10. 스트림 연산 종류 (0) | 2021.08.18 |
모던 자바 인 액션 10. 스트림 활용(4) - 리듀싱 (0) | 2021.08.18 |
모던 자바 인 액션 09. 스트림 활용(3) (0) | 2021.08.18 |