✔스트림
데이터 처리 연산
을 지원하도록 소스에서 추출된 연속된 요소
1) 연속된 요소 : filter, sorted, map
등 데이터 처리를 위한 계산식이 주를 이룸.
2) 데이터 처리 연산 : filter, map, find, match, sort
등 함수형 프로그래밍, 데이터베이스와 비슷한 연산 제공.
- 스트림의 특징
- 데이터 원본을 변경하지 않는다.
- 스트림은 일회용이다. (최종 연산을 진행하면 자동 종료.)
- 스트림의 장점
- 반복자를 사용할 필요가 없다.(forEach() 사용)
- 병렬 처리 용이.
- 스트림 자르기
- skip(n) : n 만큼의 요소 건너띄기.
- limit(n) : n 만큼의 요소로 자르기.
- 스트림 요소 걸러내기
- distinct() : 반복된 요소를 제거하고 선택.
- filter(Predicate< ? super T > predicate) : 조건을 통해 선택.
- 정렬
- sorted(Comparator< ? super T > comparator) : 특정 요소를 통해 정렬.
- 변환
- map(Function< ? super T, ? extends R > mapper) : 요소를 변환하여 반환.
- 조회
- peek(Consumer< ? super T > action) : 연산 중간 결과를 확인할 때 사용.
- 통계 정보 : 총합, 평균, 최대값, 최소값 등 (mapToInt(), mapToLong(), mapToDouble() 활용)
- IntSummaryStatistics stat = stream().mapToInt(INTEGER).summaryStatistics()
- stat.getSum(), stat.getAverage(), stat.getMax(), stat.getMin()
2. 최종 연산(Terminal Operation)
- forEach() : 반복 연산
- 조건 검사 :
- allMatch(Predicate ...) : 모든 요소가 조건을 만족하는지. boolean
- anyMatch(Predicate ...) : 어떤 요소가 조건을 만족하는지. boolean
- nonMatch(Predicate ...) : 모든 요소가 조건을 만족하지 않는지. boolean
- findFirst() : 현재 스트림의 첫 요소 반환(순서 확인).
- findAny() : 스트림을 처리할 때 가장 먼저 찾은 요소 반환(순서 미확인).
- 대용량 데이터를 사용할 때 parallelStream을 사용해 병렬 처리하고 findAny()는 이 경우 사용.
- 통계 : count(), sum(), average(), max(), min()
- IntStream과 같은 기본형 스트림에서 호출 가능.
- 리듀싱 : 스트림의 요소를 줄여가면서 연산 수행 후 최종 결과 반환.
- 두 요소를 하나의 요소로 반환
- reduce( res, BinaryOperator< T > ) : res와 스트림 요소로 연산 진행.(res = res와 요소 연산 반복. 최종적으로 res 반환.)
- 스트림 -> 컬렉션, 배열 변환
- collect(Collector< ? super T, A, R > collector) : 컬렉션 변환
- (ex) collect(Collectors.toList())
- toArray(Function<A[]> generator) : 배열 변환
- (ex) toArray(ClassName[]::new)