자바 8 에서는 박싱 비용을 피할 수 있게 IntStream, DoubleStream, LongStream 기본형 특화 스트림을 제공한다.
스트림을 특화 스트림으로 변환할 때 mapToInt, mapToDouble, mapToLong 세 가지 메소드를 지원해준다.
map 같은 기능이지만 Stream<T>대신 특화된 스트림을 반환한다.
Game 객체 리스트를 생성.
List<Game> games = Arrays.asList(
new Game("CALL 1", 20000)
, new Game("DIA 3", 30000)
, new Game("DIA 2", 40000)
, new Game("DIA 1", 50000)
);
기본형 특화 스트림
숫자 스트림으로 매핑했다가 다시 객체 스트림으로 복원.
sum, max, min 같은 메서드 등 리듀상 연산 수행 메서드도 제공한다.
int price = games.stream().mapToInt(Game::getPrice).sum(); // 특화 스트림으로 변환해서 sum 메서드 사용
System.out.println(price);
IntStream intStream = games.stream().mapToInt(Game::getPrice);
Stream<Integer> stream = intStream.boxed(); // 객체 스트림으로 복원
기본값이 없는 경우 Optional 객체 역시 기본형 특화 스트림이 제공된다.
OptionalInt, OptionalDouble, OptionalLong
OptionalInt maxPrice = games.stream().mapToInt(Game::getPrice).max();
int max = maxPrice.orElse(0); // 기본값 명시적 설정
숫자 범위
자바 8 에서는 IntStream 과 LongStream에서 range와 rangeClosed 라는 정적 메서드 제공.
두 메서드 모두 첫 번째 인수로 시작값, 두 번째 인수로 종료 값을 갖는다.
차이점은 range 메서드는 결과에 시작값과 종료값이 포함되지 않고 rangeClosed는 포함된다는 점이 다르다.
아래는 피타고라스 정리를 1 ~ 100 범위에서 가능한 조합을 결과 값으로 반환하는 코드이다.
Stream<int[]> pythago = IntStream.rangeClosed(1, 100).boxed()
.flatMap(a -> IntStream.rangeClosed(a, 100)
.filter(b -> Math.sqrt(a*a + b*b) % 1 == 0)
.mapToObj(b -> new int[]{a, b, (int)Math.sqrt(a*a + b*b)}));
pythago.limit(5).forEach(t -> System.out.println(t[0] + "," + t[1] + "," + t[2]));
결과값
limt 으로 5개만 출력하게 제한을 걸었다.
3,4,5
5,12,13
6,8,10
7,24,25
8,15,17
'Java > Stream' 카테고리의 다른 글
Collector 요약 (0) | 2022.10.28 |
---|---|
스트림 생성 (0) | 2022.10.27 |
리듀싱 (0) | 2022.10.26 |
검색과 매칭 (0) | 2022.10.26 |
map과 flatMap (0) | 2022.10.17 |