자바8은 세가지 기본형 특화 스트림을 제공한다: IntStream
, DoubleStream
, LongStream
sum
, max
등 흔히 사용되는 숫자 관련 리듀싱 연산 수행 메서드를 제공함mapToInt
, mapToDouble
, mapToLong
int calories = menu.stream() // Stream<Dish> 반환
.mapToInt(Dish::getCalories) //IntStream 반환
.sum();
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();
초기값을 설정해서 합/곱을 내는 리듀스 함수는 null 걱정이 없었지만 IntStream
의 sum
은 초기값을 받지 않는다
OptionalInt
! (OptionalDouble
, OptionalLong
)OptionalInt maxCalories = menu.stream()
.mapToInt(Dish::getCalories)
.max();
디폴트값을 설정하면 일반 숫자로 받을 수 있음
int max = menu.stream()
.mapToInt(Dish::getCalories)
.max()
.orElse(1);
특정 범위의 숫자를 사용해야 할 때는 IntStream
과 LongStream
의 range
와 rangeClosed
메서드를 사용하자
range
: 시작값과 종료값이 결과에 포함되지 않음rangeClosed
: 시작과 종료값이 결과에 포함됨IntStream evenNumbers = IntStream.rangeClosed(1, 100) // [1, 100]의 범위
.filter(n -> n % 2 == 0);
참고: Modern Java in Action (라울-게이브리얼 등 지음)