[Java] 숫자형 Stream

지니🧸·2023년 4월 7일
0

Java

목록 보기
3/13

🎞️ 기본형 특화 스트림

자바8은 세가지 기본형 특화 스트림을 제공한다: IntStream, DoubleStream, LongStream

  • 각 인터페이스는 sum, max 등 흔히 사용되는 숫자 관련 리듀싱 연산 수행 메서드를 제공함
  • 다시 객체 스트림으로 복원하는 기능도 제공
  • 특화 스트림은 오직 박싱 과정에서 일어나느 효율성에만 관련있음
    • 추가 기능 제공 X

🎞️ 숫자 스트림으로 매핑: mapToInt

mapToInt, mapToDouble, mapToLong

int calories = menu.stream() // Stream<Dish> 반환
				.mapToInt(Dish::getCalories) //IntStream 반환
                .sum();

🎞️ 객체 스트림으로 복원하기: boxed

IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();

🎞️ OptionalInt

초기값을 설정해서 합/곱을 내는 리듀스 함수는 null 걱정이 없었지만 IntStreamsum은 초기값을 받지 않는다

  • 스트림에 요소가 없는 상황과 실제 최댓값이 0인 상황을 어떻게 구별할까?
  • 정답은 OptionalInt! (OptionalDouble, OptionalLong)
OptionalInt maxCalories = menu.stream()
							.mapToInt(Dish::getCalories)
                            .max();

디폴트값을 설정하면 일반 숫자로 받을 수 있음

int max = menu.stream()
			.mapToInt(Dish::getCalories)
            .max()
            .orElse(1);

🎞️ 숫자 범위

특정 범위의 숫자를 사용해야 할 때는 IntStreamLongStreamrangerangeClosed 메서드를 사용하자

  • 둘 다:
    • 정적 메서드
    • 첫번째 인수로 시작값, 두번째 인수로 종료값을 가짐
  • range: 시작값과 종료값이 결과에 포함되지 않음
  • rangeClosed: 시작과 종료값이 결과에 포함됨
IntStream evenNumbers = IntStream.rangeClosed(1, 100) // [1, 100]의 범위
							.filter(n -> n % 2 == 0); 

참고: Modern Java in Action (라울-게이브리얼 등 지음)

profile
우당탕탕

0개의 댓글