더북(TheBook)

이제 객체 스트림이 있고, 문자열 스트림에서 모든 문자열의 길이 같은 특정 프로퍼티의 합계를 구하려 한다고 하자. 단순한 형태의 reduce는 사용할 수 없고, 인자들과 결과의 타입이 같은 (T, T) -> T 함수가 필요하다. 하지만 이 상황에서는 두 가지 타입이 있다. 다시 말해, 스트림 요소들은 String이고, 누적 결과는 정수다. 물론 이 상황을 다룰 수 있는 reduce 형태가 있다.

먼저 ‘누적’ 함수 (total, word) -> total + word.length()를 전달한다. 이 함수는 반복 호출되어 누적 합계를 만들어낸다. 하지만 계산을 병렬화하면 이와 같은 계산이 여러 개 존재하므로 각각의 결과를 결합해야 한다. 따라서 각 부분의 결과를 결합하는 데 사용할 두 번째 함수를 전달한다. 완성된 호출 형태는 다음과 같다.


int result = words.reduce(0,

(total, word) -> total + word.length(),

(total1, total2) -> total1 + total2);


 

<Note>

실전에서는 reduce 메서드를 많이 사용하지 않을 것이다. 보통은 숫자 스트림에 맵핑한 후 스트림의 합계, 최댓값, 최솟값 계산 메서드를 사용하는 것이 더 쉽다(다음에 나올  “2.12 기본 타입 스트림” 절에서 숫자 스트림을 설명한다). 앞의 예제에서는 words.mapToInt(String::length).sum()을 호출하는 방법으로 해결할 수 있고, 이렇게 하면 박싱 boxing이 일어나지 않기 때문에 더 단순하면서도 더 효율적이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.