더북(TheBook)

일반적으로 reduce 메서드가 리덕션 연산 op를 가지면, 해당 리덕션은 V0 op V1 op V2 op ...을 돌려준다. 여기서는 함수 호출 op(Vi, Vi + 1)을 Vi op Vi + 1로 작성했다. 연산은 결합 법칙을 지원associative해야 한다. 즉, 요소들을 결합하는 순서는 문제가 되지 않아야 한다. 수학에서는 결합 법칙을 (x op y) op z = x op (y op z)로 표기한다. 연산이 결합 법칙을 지원하면 병렬 스트림을 통한 효율적인 리덕션이 가능하다.

합계, 곱셈, 문자열 연결, 최댓값과 최솟값, 합집합과 교집합 등 실전에서 유용한 다양한 결합 연산이 있다. 결합 법칙이 적용되지 않는 연산의 예는 뺄셈으로, (6 - 3) - 2 ≠ 6 - (3 - 2)다.

e op x = x 같은 항등값identity e 가 있을 때는 해당 요소를 계산의 시작으로 사용할 수 있다. 예를 들면, 0은 덧셈의 항등값이다. 이제 두 번째 형태의 reduce를 호출한다.


Stream<Integer> values = ...;

Integer sum = values.reduce(0, (x, y) -> x + y)

// 0 + V0 + V1 + V2 + . . . 을 계산한다.


 

스트림이 비어 있으면 항등값을 리턴하므로, 더는 Optional 클래스를 다룰 필요가 없다.

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