2016-12-08 12 views
4

Stream::reduce 메서드의 accumulator 인수가 BiFunction이고 combiner 인수와 같은 BinaryOperator이 아닌 이유는 무엇입니까?왜 누산기가 Stream :: :: BiFunction을 줄이고 결합 자처럼 BinaryOperator를 줄이지 않습니까?

이유는 무엇입니까 BiFunction<U, ? super T, U>? 왜 T일까요? BiFunction<U, ? extends U, U>일까요?

+2

질문은 완전히 명확하지 않지만 http://stackoverflow.com/questions/35680706/what-are-good-reasons-for-choosing-invariance-in-an-api-와 관련이있을 수 있습니다. (오히려 "반대"질문 인 것처럼 보이지만 ...) – Marco13

답변

6
<U> U reduce(U identity, 
      BiFunction<U, ? super T, U> accumulator, 
      BinaryOperator<U> combiner); 

어큐뮬레이터는 (타입 T로 나타낸다) (유형 U로 표기 됨) reduce 연산의 중간 결과에 Stream의 요소를 추가하고, 갱신 된 결과를 돌려주는 함수 (유형도 U).

따라서 피연산자와 결과가 모두 같은 유형 인 BinaryOperator으로 정의 할 수 없습니다.

예를 들어, reduce 전화 발신 Stream<String>에 적용 모든 요소의 길이의 합을 생산하는 BiFunction<Integer,String,Integer>축적로 전달할 수 있습니다. 이 경우 BinaryOperator<Integer> 또는 BinaryOperator<String>을 사용할 수 없습니다. 한편

상기 결합기 는 (동일한 타입의 두 U) 개의 중간 결과를 받아 그 입력 U이기도 결과로 병합. 따라서 (BiFunction<U,U,U>까지 확장)을 사용할 수 있습니다.

+0

U 감소 (U 신원, BiFunction 누적 기, BinaryOperator 결합 자); , 나는 누적 기가 BiFunction이고 서명이 있어야하는이 버전의 메서드에 대해 묻습니다. super U. https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html –

+2

@AhmadMoawad 그 대답은 제가 언급 한 것과 같은 방법입니다. – Eran