[Java] Stream 정리
Stream은 자바 8부터 추가된 기능으로 컬렉션, 배열등의 저장 요소를 하나씩 참조하여 함수형 인터페이스(lambda expression)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능
왜 사용하는가? 불필요한 코딩(for, if 문법)을 걷어낼 수 있고 직관적이기 때문에 가독성이 좋아진다.
Stream 특징
- 원본의 데이터를 변경하지 않는다.
Stream API는 원본의 데이터를 조회하여 원본의 데이터가 아닌 별도의 요소들로 Stream을 생성한다. 그렇기 때문에 원본의 데이터로부터 읽기만 할 뿐이며, 정렬이나 필터링 등의 작업은 별도의 Stream 요소들에서 처리가 된다.
- 일회용이다.
Stream은 일회용이기 때문에 한번 사용이 끝나면 재사용이 불가능하다. Stream이 또 필요한 경우 다시 생성해야하며, 재사용을 한다면 IllegalStateException이 발생한다.
- 내부 반복으로 작업을 처리한다.
Stream 중간연산
연산 결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 할 수 있다.
-
filter
- 조건에 맞게 거르는 것
-
map
- 원하는 필드만 뽑아내거나 특정 형태로 변환할 때 사용
Stream<R> map(Function<? super T, ? extends R> mapper);
-
peek
-
sorted
-
limit
-
distinct
-
skip
-
mapToInt, mapToLong, mapToDouble…
Stream 최종연산
스트림의 요소를 소모하면서 연산을 수행하기 때문에 한번만 연산이 가능하다
- count(), min(), max(), sum(), average()
- reduce()
- 스트림의 요소를 줄여나가면서 연산을 수행하고 최종결과를 반환
- forEach()
- collect()
- reduce()와 유사하나, collect()는 매개변수 타입이 Collector이다.
- iterator()+
parallel stream
내부적으로 fork & join 프레임워크를 이용해서 자동적으로 연산을 병렬로 수행한다.
여러 쓰레드가 스트림에서 요소를 필터링하고 나온 요소 수를 계산하고 쓰레드끼리 다시 한 번 각자 계산한 값들을 더해서 return 해준다.