[20210602] Stream Function in Java

필터링과 슬라이싱

filter

Predicate(boolean을 반환하는 함수)를 인수로 받아서 Predicate와 일치하는 모든 요소를 포함하는 스트림을 반환.

distinct

고유 요소로 이루어진 스트림을 반환. 고유 여부는 스트림에서 만든 객체의 hashCode, equals로 결정된다.

limit

주어진 사이즈 이하의 크기를 갖는 새로운 스트림을 반환. 정렬되지 않은 스트림(ex, Set)에도 사용할 수 있다. 대신 limit의 결과도 정렬되지 않은 상태로 반환된다.

skip

처음 n개 요소를 제외한 스트림을 반환. n개 이하의 요소를 포함하는 스트림에 skip(n)을 호출하면 빈 스트림이 반환된다.

매핑

map

인수로 제공된 함수는 각 요소에 적용되며 함수를 적용한 결과가 새로운 요소로 매핑된다. map의 결과로 새로운 요소의 stream이 반환된다.

flatmap

각 배열을 스트림이 아니라 스트림의 콘텐츠로 매핑한다. 즉, map(Arrays::stream)과 달리 flatMap은 하나의 평면화된 스트림을 반환한다. 스트림의 각 값을 다른 스트림으로 만든 다음에 모든 스트림을 하나의 스트림으로 연결하는 기능을 수행.

검색과 매칭

특정 속성이 데이터 집합에 있는지 여부를 검색하는 데이터 처리에 사용

anyMatch

적어도 한 요소와 Predicate가 일치하는지 확인, boolean 반환

allMatch

모든 요소가 주어진 Predicate와 일치하는지 검사, boolean 반환

noneMatch

allMatch와 반대 연산을 수행. 주어진 Predicate와 일치하는 요소가 없는지 확인.

이 세가지 메서드는 스트림 쇼트서킷 기법을 활용한다.

쇼트서킷 : 전체 스트림을 처리하지 않더라도 결과를 반환할 수 있는 상황

findAny

현재 스트림에서 임의의 요소를 반환(Optional로 반환)한다. 스트림 파이프라인은 내부적으로 단일 과정으로 실행할 수 있도록 최적화된다. 즉, 쇼트서킷을 이용해서 결과를 찾는 즉시 실행을 종료함.

Optional이란? 값의 존재나 부재 여부를 표현하는 컨테이너 클래스.

findFirst

리스트 또는 정렬된 연속 데이터로부터 생성된 스트림에서 첫 번째 요소를 찾는다.

findFirst와 findAny는 언제 사용하나? 병렬 실행에서는 첫 번째 요소를 찾기 어렵다. 따라서 요소의 반환 순서가 상관없다면 병렬 스트림에서는 제약이 적은 findAny를 사용한다.

리듀싱

reduce

스트림의 모든 요소를 하나의 값으로 줄어들 때 까지 선언한 람다를 적용한다. 두 개의 파라미터가 사용되며, 초깃값과 리스트의 모든 요소를 조합하는 연산 람다 함수이다.
초깃값을 받지 않도록 오버로드된 reduce도 있다. 그러나 Optional 객체를 반환함. 만약 스트림에 아무 요소가 없다면 초깃값이 없으므로 합계를 반환할 수 없기 때문이다.


출처

Java 8 in Action by Alan Mycroft and Mario Fusco 참고