Language/Java

15-4(1). 스트림의 최종 연산

리져니 2021. 8. 5. 17:17

최종 연산은 스트림의 요로를 소모해서 결과를 만들어 낸다. 때문에 최종 연산 후에는 스트림이 닫히고 더이상 사용할수 없다. 최종 연산의 결과는 스트림 요소의 합과 같은 단일 값이거나, 스트림의 요소가 담긴 베열 또는 컬렉션일 수 있다.

 

forEach()

스트림의 요소를 소모하는 최종연산. 반환 타입이 void이므로 스트림의 요소를 출력하는 용도로 많이 사용된다.

 

예제

IntStream.range(1,10).parallel().forEach(System.out::print)		// 683295714
IntStream.range(1,10).parallel().forEachOrdered(System.out::print)	// 123456789

 

조건 검사: allMatch(), anyMatch(), noneMath(), findFirst(), findAny()

스트림의 요소에 대해 지정된 저건에 모든 요소가 일치하는지, 일부가 일치하는지, 아니면 어떤 요소도 일치하지 않는지 확인하는데 사용. 매개변수로 조건식을 요구한다.

 

예제

boolean noFailed = stuStream.anyMatch(s -> s.getTotalScore() <= 100);

 

조건에 일치하는 요소 찾기: findFirst(), findAny()

* 병렬 스트림인 경우에는 findFirst()대신 findAny()를 사용해야 한다.

filter()와 함께 사용되어 조건에 맞는 스트림의 요소가 있는지 확인하는데 사용할 수 있다.

 

예제

Optional<Student> stu = stuStream.filter(s -> s.getTotalScore() <= 100).findFirst();
Optional<Student> stu = parallelStream.filter(s -> s.getTotalScore() <= 100).findAny();

findAny()와 findFirst()의 반환 타입은 Optional<T>이며, 스트림의 요소가 없을 때는 비어있는 Optional객체를 반환한다.

 

 

통계: count(), sum(), average(), max(), min()

 

리듀싱: Reduce()

스트림의 요소를 하나씩 줄여가며 누적연산을 수행하고 최종 결과를 반환

 

 

연산결과의 초기값(identity)을 갖는 reduce()도 있는데, 이 메서드들은 초기값과 스트림의 첫번째 요소로 연산을 시작한다. 스트림의 요소가 하나도 없는 경우, 초기값이 반환되므로 반환 타입이 T 이다.

 

combiner는 병렬 스 트림에 의해 처리된 결과를 합칠 때 사용하기 위해 사용하는 것이다.

* 통계 부분의 count()와 sum() 등의 메서드들은 내부적으로 모두 redue()를 이용해서 작성된 것이다.

 

에제

int count = intStream.reduce(0, (a,b) -> a + 1);
int sum = intStream.reduce(0, (a,b) -> a + b);
int max = intStream.reduce(Integer.MIN_VALUE, (a,b) -> a > b ? a : b);
int min = intStream.reduce(Integer.MAX_VALUE, (a,b) -> a < b ? a: b);

 

 

728x90

'Language > Java' 카테고리의 다른 글

16-1. 입출력 I/O: 바이트기반 스트림  (0) 2021.08.08
15-4(2). 스트림의 최종 연산 - Collect  (0) 2021.08.05
15-3. Optional  (0) 2021.08.05
15-2. 스트림의 중간 연산  (0) 2021.08.05
15-1. 스트림 만들기  (0) 2021.08.04