본문 바로가기

개발

java8 과 stream, reduce 연산

스트림

컬런션은 자바에서 가장 많이 사용하는 기능 중 하나이다.

자바애플리케이션은 컬렉션을 만들고 처리하는 과정을 포함한다.

 

많은 요소를 포함하는 컬렉션의 처리

성능을 높이기 위한 멀티코어 아키텍쳐를 확용하기 위한 병렬 처리

-> 답은 스트림이다.

 

스트림은 자바 api에 새로 추가된 기능으로 선언형으로 컬렉션 데이터를 처리 할 수 있다.

 

스트림의 특징

. 선언형 - 더 간결하고 가독성이 좋아진다.

. 조립할 수 있음 - 유연성이 좋아진다.

. 병렬화 - 성능이 좋아진다.

 

스트림 이용 과정은 세가지로 요약 가능하다

. 질의를 수행할 데이터 소스

. 스트림 파이프라인을 구성할 중간 연산 연결

. 스트림 파이프라인을 실행하고 결과를 만들 최종연산

 

숫자형 스트림

. 메뉴의 칼로리 합계를 계산하는 스트림

int calories = menu.stream()
.map(Dish::getCalories)
.reduce(0, Integer::sum);

getCalories는 int 형

여기에는 박싱 비용이 숨겨져 있는데 이것을 피하려면

int calories  = menu.stream()
.mapToInt(Dish::getCalories)
.sum();

이렇게 기본형 특화 스트림을 써서 박싱 비용을 피할수 있다.

스트림이 없는 상황을 대비 하기 위해서 OptionalInt를 사용 할 수도 있다.

OptionalInt calories  = menu.stream()
.mapToInt(Dish::getCalories)
.sum();

스트림 왠만한건 써보면 바로바로 알수 있는것들이라 패스.

 

리듀싱 연산

. reduce를 이용하면 반복된 패턴을 추상화할 수 있다.

. reduce 는 두개의 인수를 갖는다.

1. 초기값 0

2. 두 요소를 조합해서 새로운 값을 만드는 BinaryPoerator<T>

. reduce로 람다를 넘겨준다.

numbers.stream().reduce(1, (a,b) -> a*b);

 

초깃값을 받지 않도록 된 오버로드 된 reduce도 있다.

이 reduce는 Optional 객체를 반환한다.

 

reduce 사용한는것에 대한 장점

. 내부반복이 추상화되면서 내부 구현에서 병렬로 reduce를 실행할수 있게 된다.