JaeniWorld
[Java] Stream 연산 본문
Stream 연산
스트림 인터페이스는 크게 중간연산과 최종연산으로 나뉜다.
중간연산
그림의 초록색 부분에 해당하며 filter(), map(), limit(), sorted(), distinct()등이 이에 포함된다. Stream<>을 반환하는 것이 특징이며, 단말 연산을 스트림 파이프라인에 실행하기 전까지는 아무 연산도 수행하지 않는다. (Laziness)
최종 연산
그림의 노색 부분에 해당하며 forEach(), count(), collect()등이 이에 포함된다. void, long, collection을 반환하는 것이 특징이며, 최종 연산값을 반환한다.
분류 |
종류 |
예시 |
필터링 |
프레디케이트 |
.filter(Dish::isVege) |
고유요소 필터링 |
.filter(i->i%2==0) .distinct() |
|
Limit(n) |
.filter() .limit(n) |
|
Skip(n) n개의 객체 건너뛰고 반환 |
.filter() .skip(n) |
- 매핑: 인수로 제공된 함수는 각 요소에 적용되며, 함수를 적용한 결과가 새로운 요소로 매핑된다.
Ex. 문자열 리스트.map(string::length).collection(toList()) -> [n1,n2,n3,n4]반환
1. 스트림 평면화: 문자열로 이루어진 리스트에서 중복되지 않는 알파벳만 추출하여 리스트로 반환받고 싶을 때, 리스트에 그냥 distinct를 사용하면 적용되지 않아 Arrays.stream을 사용하여 Stream객체를 반환받고 이를 바탕으로 distinct하여야 원하는 값을 반환받을 수 있다
2. flatMap: 각 배열을 스트림이 아니라 스트림의 콘텐츠로 매핑한다. Map(Arrays:stream)과 달리 하나의 평면화된 스트림 반환
- 검색
anyMatch(): list내에 하나라도 일치하는 요소 있는지 확인
allMatch(): 모든 요소가 프레디케이트와 일치하는지?
noneMatch(): 모든 요소가 프레디케이트와 일치하지 않는지?
findAny(): 현재 스트림에서 임의의 요소 반환
리듀싱
모든 스트림 요소를 처리해서 값으로 도출하는 연산
기본형 특화 스트림(primitive stream specialization)[1]
Stream은 주로 객체의 collection을 작업하는 형태이기 때문에 기본 자료형으로는 작업할 수 없다. 그렇기 때문에 이를 보완하기 위해(collection을 기본형으로 변환하는 박싱 비용을 피하기 위해) 제공되는 것이 바로 기본형 특화 스트림이다.
1. 숫자 스트림으로 매핑
mapToInt, mapToDouble, mapToLong 세가지 메서드를 많이 사용하며 Stream<T>보다 특화된 스트림 반환
2. 객체 스트림으로 반환
반환된 스트림.boxed()하면 다시 객체 스트림으로 반환된다
무한스트림
고정된 컬렉션에서 고정된 크기로 만드는 스트림과 달리, 크기가 고정되지 않은 스트림으로 iterate와 generate를 통해 요청할 때마다 함수를 이용해 값을 만든다. 따라서 무제한으로 값을 계산할 수 있지만 limit와 함께 사용하여 출력되는 값을 제한한다.
- Iterate
요청할 때 마다 순차적인 값을 생산함
- Generate
Iterate와 같이 요청할 때 마다 값을 생산하지만, 생산된 각 값을 연속적으로 계산하지는 않음
정보로깅
파이프라인 연산은 최종연산 메소드를 만나야 값을 반환하기 때문에, 데이터소스가 중간연산을 만나 계산되는 값을 확인할 수 없다. 그래서 중간값을 확인하기 위하여 peek()메소드를 사용해 파이프라인의 각 단계별 상태를 볼 수 있다.
Reference
-docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 디폴트 메소드(Default methods) (0) | 2021.01.12 |
---|---|
[Java] Java 8에 추가된 API (0) | 2021.01.12 |
[Java] Collection factory (0) | 2021.01.12 |
[Java] Stream 데이터 수집 (0) | 2021.01.11 |
[Java] Stream API, Stream과 Collection의 차이 (0) | 2021.01.11 |