요소의 타입이 T인 스트림은 기본적으로 Stream<T>이지만, 오토박싱 & 언박싱으로 인한 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는 스트림인 IntStream, LongStream, DoubleStream이 제공된다.
Stream<Integer>를 대신 IntStream을 사용하는 것이 더 효율적이고, int 타입의 값으로 작업하는데 유용한 메서드들이 포함되어 있어 유리하다.
// 스트림의 병렬 처리 예제
int sum = strStream.parallel() // strStream을 병렬 스트림으로 전환
.mapToInt(s -> s.length())
.sum();
병렬처리가 항상 더 빠른 결과를 얻게 해주는 것이 아니라는 것에 주의해야 한다.
// Collection에 정의된 스트림 메서드
Stream<T> Collection.stream()
// List로 부터 스트림을 생성하는 예제
List<Integer> list = Arrays.asList(1,2,3,4,5); // 가변인자
Stream<Integer> intStream = list.stream(); // list를 소스로 하는 컬렉션 생성
// forEach()를 사용하는 예제
intStream.forEach(System.out::println); // 스트림의 모든 요소를 출력한다.
intStream.forEach(System.out::println); // 에러. 스트림이 이미 닫혔다.
배열을 소스로 하는 스트림을 생성하는 메서드는 Stream과 Arrays에 정의되어 있다.
// Stream과 Arrays에 정의된 메서드 List
Stream<T> Stream.of(T... values) // 가변 인자
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)
// 문자열 스트림을 생성하는 다양한 예제
Stream<String> strStream = Stream.of("a", "b", "c"); // 가변인자
Stream<String> strStream = Stream.of(new String[] {"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"}, 0, 3);
// 기본형 배열을 소스로 하는 스트림 예제
IntStream IntStream.of(int... values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)
위 예제처럼 IntStream 이외에도 LongStream과 DoubleStream을 반환하는 메서드들도 존재한다.
IntStream과 LongStream은 지정된 범위의 연속된 정수를 스트림으로 생성해서 반환하는
range( )와 rangeClosed( )를 가지고 있다.
// range()
IntStream IntStream.range(int begin, int end)
// rangeClosed()
IntStream IntStream.rangeClosed(int begin, int end)
range( )의 경우 end가 범위에 포함되지 않고, rangeClosed( )는 포함된다.
// range() 사용 예제
IntStream intStream = IntStream.range(1,5); // 1,2,3,4
// rangeClosed() 사용 예제
IntStream intStream = IntStream.rangeClosed(1,5); // 1,2,3,4,5
int보다 큰 범위의 스트림을 생성하려면 LongStream에 정의된 동일한 이름의 메서드를 사용하면 된다.
람보와 스트림