스트림
컬런션은 자바에서 가장 많이 사용하는 기능 중 하나이다.
자바애플리케이션은 컬렉션을 만들고 처리하는 과정을 포함한다.
많은 요소를 포함하는 컬렉션의 처리
성능을 높이기 위한 멀티코어 아키텍쳐를 확용하기 위한 병렬 처리
-> 답은 스트림이다.
스트림은 자바 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를 실행할수 있게 된다.
'개발' 카테고리의 다른 글
개발자 신입으로 입사 했을때 팀장님에게 받았던 조언 (0) | 2021.06.30 |
---|---|
Field Injection vs Constructor Injection With Java Spring's @Autowired (0) | 2021.06.29 |
java8과 lambda 의 사용법 (0) | 2021.06.24 |
JAVA8 대표적인 변화와 함수형 프로그래밍 느낀점 (0) | 2021.06.20 |
docker base image Debian 과 alpine - 효율적인 도커 이미지 (0) | 2021.06.19 |