-
람다와 스트림 - 최종 연산백엔드/자바 2023. 4. 17. 05:40
스트림의 최종 연산이란?
이전 파트에서 배웠듯이 스트림은 일반적인 객체와 달리 한번 사용하고 나면 재활용이 불가능하다고 배웠다.
그때 이 사용의 기준이 되는 것이 바로 최종 연산이다.
이전에 써먹었던 그림을 다시 가져오면 위와 스트림은 위와 같은 과정으로 사용하게 된다.
컬렉션 데이터에 대한 스트림 요소를 생성한 뒤 중간 연산을 통해 데이터를 가공한다.
그 뒤에 최종 연산 과정에서 스트림 요소를 소모하면서 스트림의 사용이 끝나게 되는 것이다.
해당 파트에서는 스트림의 다양한 최종 연산 방법에 대해 공부해보도록 하겠다.
최종 연산 - forEach() : 결과 출력
forEach()는 많은 예시에서 이미 사용했는데 스트림의 데이터들을 출력하는 기능을 한다.
forEach() 메서드는 반환 타입이 void이므로 아무것도 반환하지 않는다.
그리고 인수로는 Consumer 인터페이스 형식의 람다식만 전달 받는다.
최종 연산 - allMatch(), anyMatch(), noneMatch : 조건식 일치 여부
이번 단락에서 소개할 메서드들은 조건에 따른 결과가 일치하는지 여부를 따지는 기능을 한다.
- allMatch() : 전달된 인자가 전부 조건에 맞을 경우 true 반환.
- anyMatch() : 전달된 인자 중 하나라도 조건에 맞을 경우 true 반환.
- nonMatch() : 전달된 인자가 모두 조건에 안맞을 경우 true 반환.
위의 그림과 메서드 설명만 봐도 사용이 어려운 메서드는 아니라는 걸 알 수 있다.
세 개의 메서드 모두 boolean을 반환타입으로 갖고 있으며 인자로는 Predicate 인터페이스의 람다식을 받는다.
최종 연산 - findFirst(), findAny() : 조건식 일치 여부
- findFirst() : 조건 식에 맞는 요소들 중에서 가장 첫번째 요소 반환
- findAny() : 조건 식에 맞는 요소들 중에서 아무 요소나 하나 반환
findFirst()와 findAny()는 filter()와 같이 쓴다고 보면 편하다.
filter()를 통해서 걸러진 요소들 중 findFirst()는 첫 번째 요소를 findAny() 랜덤한 요소를 하나 반환한다.
이때 주의할 점은 findAny()는 parallelStream() 즉 병렬 스트림일 때만 제대로 작동한다.
만약 일반 직렬 스트림일 경우 findFirst()처럼 조건에 맞는 요소 중 첫번째 요소를 반환한다.
그리고 하나 더 중요한 점은 findFirst()와 findAny() 모두 반환타입이 Optional이라는 것이다.
이는 조건에 맞는 식이 하나도 없는 경우를 NullPointException을 방지하기 위함이다.
최종 연산 - reduce() : 스트림의 누적 연산을 수행
reduce는 겉보기에는 복잡해 보이지만 실은 그렇게까지 어렵진 않다.
reduce에 인수로 제공되는 수는 초기값, 스트림 요소의 연산 결과값, 스트림 요소 총 세가지다.
연산 과정을 설명하자면 다음과 같다.
- a의 초기값은 지정된 숫자 0에서 시작한다. 연산이 진행되면 a는 a+b의 값을 갖는다.
- b는 연산이 진행됨에 따라 list의 요소들을 차례로 갖는다.
- 즉 연산 과정에 따른 값의 변화는 다음과 같다.
- 0+1 = 1
- 1+2 = 3
- 3+3 = 6
- 6+4 = 10
- 10+5 = 15
표로 나타내면 위와 같다고 보면 된다.
a는 처음 연산에만 초기값을 빌려 쓰고 그 다음 연산부터는 a는 연산의 결과인 a+b의 값을 사용한다.
reduce는 이런식으로 모든 요소에 대한 누적 연산이 가능하고 이를 이용해 다양한 연산이 가능하다.
위의 그림을 통해 reduce()의 인수로 어떤 초기값과 식을 주느냐에 따라 결과는 다르게 나오는 것을 확인할 수 있다.
'백엔드 > 자바' 카테고리의 다른 글
람다와 스트림 - collect() part 2 (0) 2023.04.19 람다와 스트림 - collect() part1 (0) 2023.04.17 람다와 스트림 - Optional<T> (0) 2023.04.17 람다와 스트림 - 중간 연산 part 2 (0) 2023.02.13 람다와 스트림 - 중간 연산 part 1 (0) 2023.02.11