자바 8 시리즈 의 Stream 에서 만능 reduce 용법 설명
reduce 방법 은 세 가지 override 방법 이 있 습 니 다.
Optional<T> reduce(BinaryOperator<T> accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
<U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);
우 리 는 먼저 첫 번 째 변형 을 보 았 습 니 다.함수 인터페이스 인 Binary Operator
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
}
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
}
사용 할 때,우 리 는 Lambada 표현 식 을 사용 하여 표시 할 수 있다Binary Operator 인 터 페 이 스 는 reduce 방법 으로 함 수 를 받 아들 이 는 것 을 볼 수 있 습 니 다.이 함 수 는 두 개의 매개 변수 가 있 습 니 다.첫 번 째 매개 변 수 는 지난번 함수 가 실 행 된 반환 값(중간 결과 라 고도 함)이 고 두 번 째 매개 변 수 는 stream 의 요소 입 니 다.이 함 수 는 이 두 개의 값 을 더 하면 다음 에 이 함 수 를 실행 하 는 첫 번 째 매개 변수 에 값 을 부여 합 니 다.주의해 야 할 것 은 첫 번 째 실행 할 때 첫 번 째 매개 변수의 값 은 Stream 의 첫 번 째 요소 이 고 두 번 째 매개 변 수 는 Stream 의 두 번 째 요소 입 니 다.이 방법 반환 값 형식 은 optional 입 니 다.
Optional accResult = Stream.of(1, 2, 3, 4)
.reduce((acc, item) -> {
System.out.println("acc : " + acc);
acc += item;
System.out.println("item: " + item);
System.out.println("acc+ : " + acc);
System.out.println("--------");
return acc;
});
System.out.println("accResult: " + accResult.get());
System.out.println("--------");
//
--------
acc : 1
item: 2
acc+ : 3
--------
acc : 3
item: 3
acc+ : 6
--------
acc : 6
item: 4
acc+ : 10
--------
accResult: 10
--------
다음은 두 번 째 변형 을 살 펴 보 겠 습 니 다.첫 번 째 변형 과 같은 것 은 Binary Operator 함수 인 터 페 이 스 를 받 아들 이 는 것 입 니 다.다른 것 은 하나의 idenity 인 자 를 받 아들 여 Stream 순환 의 초기 값 을 지정 하 는 것 입 니 다.Stream 이 비어 있 으 면 이 값 을 되 돌려 줍 니 다.다른 한편,이 방법 은 null 이 나타 나 지 않 기 때문에 optional 로 돌아 가지 않 습 니 다.
int accResult = Stream.of(1, 2, 3, 4)
.reduce(0, (acc, item) -> {
System.out.println("acc : " + acc);
acc += item;
System.out.println("item: " + item);
System.out.println("acc+ : " + acc);
System.out.println("--------");
return acc;
});
System.out.println("accResult: " + accResult);
System.out.println("--------");
//
acc : 0
item: 1
acc+ : 1
--------
acc : 1
item: 2
acc+ : 3
--------
acc : 3
item: 3
acc+ : 6
--------
acc : 6
item: 4
acc+ : 10
--------
accResult: 10
--------
인쇄 결 과 를 통 해 알 수 있 듯 이 reduce 앞의 두 가지 변형 은 매개 변수 가 다 르 기 때문에 실 행 된 작업 도 상응 한 변화 가 있 습 니 다.변형 1.초기 값 이 정의 되 지 않 아 첫 번 째 로 실 행 될 때 첫 번 째 매개 변수의 값 은 Stream 의 첫 번 째 요소 이 고 두 번 째 매개 변 수 는 Stream 의 두 번 째 요소 입 니 다.
변형 2,초기 값 을 정의 하여 첫 번 째 실행 할 때 첫 번 째 매개 변수의 값 은 초기 값 이 고 두 번 째 매개 변 수 는 Stream 의 첫 번 째 요소 입 니 다.
세 번 째 변형 에 대해 우 리 는 먼저 각 매개 변수의 의 미 를 봅 니 다.첫 번 째 매개 변 수 는 인 스 턴 스 u 를 되 돌려 주 고 돌아 갈 U 유형 대상 의 초기 화 인 스 턴 스 u 를 전달 합 니 다.두 번 째 매개 변 수 는 누적 기 accumulator 입 니 다.이원 을 사용 할 수 있 습 니까?표현 식(즉 이원 lambda 표현 식)은 u 에 데이터 원본 t 를 누적 하 는 논 리 를 설명 합 니 다.예 를 들 어(u,t)->u.sum(t).이때 lambda 표현 식 의 행 참 목록 은 인 스 턴 스 u 와 옮 겨 다 니 는 집합 요소 t 입 니 다.함수 체 는 u 에 t 를 누적 하고 세 번 째 매개 변수 조합 기 combiner 입 니 다.똑 같이 이원 입 니까?표현 식,(u,t)->u.
공식 문서 에 이런 소개 가 있 는데,
U result = identity;
for (T element : this stream)
result = accumulator.apply(result, element)
return result;
but is not constrained to execute sequentially.
The identity value must be an identity for the combiner function. This means that for all u, combiner(identity, u) is equal to u. Additionally, the combiner function must be compatible with the accumulator function; for all u and t, the following must hold:
combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)
reduce 의 변 형 된 첫 번 째 매개 변수 유형 은 실제 인 스 턴 스 의 데이터 형식 을 되 돌려 주 는 동시에 하나의 범 형 이기 때문에 이 변 형 된 데 이 터 를 임의의 형식의 데 이 터 를 되 돌려 줄 수 있다 는 것 을 의미한다.위 문서 에서 소개 한 글자 의 뜻 을 해석 하면 세 번 째 매개 변수 함수 가 두 개의 값 을 조합 하 는 데 사용 되 는데 이 두 개의 값 은 반드시 두 번 째 함수 매개 변수 와 호 환 되 어야 한다.즉,그들 이 얻 은 결 과 는 같다 는 것 이다.이곳 을 보면 분명 현혹 되 는 부분 이 있 을 것 이다.세 번 째 매개 변 수 는 도대체 무엇 에 쓰 이 는 것 일 까?우 리 는 먼저 코드 를 보 았 습 니 다.그 이 유 를 쉽게 알 기 위해 람 다 표현 식 을 사용 하지 않 았 습 니 다.
ArrayList<Integer> accResult_ = Stream.of(1, 2, 3, 4)
.reduce(new ArrayList<Integer>(),
new BiFunction<ArrayList<Integer>, Integer, ArrayList<Integer>>() {
@Override
public ArrayList<Integer> apply(ArrayList<Integer> acc, Integer item) {
acc.add(item);
System.out.println("item: " + item);
System.out.println("acc+ : " + acc);
System.out.println("BiFunction");
return acc;
}
}, new BinaryOperator<ArrayList<Integer>>() {
@Override
public ArrayList<Integer> apply(ArrayList<Integer> acc, ArrayList<Integer> item) {
System.out.println("BinaryOperator");
acc.addAll(item);
System.out.println("item: " + item);
System.out.println("acc+ : " + acc);
System.out.println("--------");
return acc;
}
});
System.out.println("accResult_: " + accResult_);
//
item: 1
acc+ : [1]
BiFunction
item: 2
acc+ : [1, 2]
BiFunction
item: 3
acc+ : [1, 2, 3]
BiFunction
item: 4
acc+ : [1, 2, 3, 4]
BiFunction
accResult_: [1, 2, 3, 4]
accResult_: 10
먼저 예제 코드 에서 첫 번 째 매개 변 수 는 Array List 이 고 두 번 째 함수 매개 변수 에'BiFunction'을 인쇄 했 으 며 세 번 째 매개 변수 인터페이스 에 함수 인터페이스 에'Binary Operator'를 인쇄 했다.그러나 인쇄 결 과 를 보면'BiFunction'만 인쇄 했 을 뿐'Binary Operator'를 인쇄 하지 않 았 다 는 것 은 세 번 째 함수 매개 변수 병 이 실행 되 지 않 았 음 을 의미한다.여기 서 우 리 는 이 변형 이 임의의 유형의 데 이 터 를 되 돌 릴 수 있다 는 것 을 알 게 되 었 다.세 번 째 함수 매개 변 수 는 왜 실행 되 지 않 았 습 니까?처음에 도 무슨 뜻 인지 알 아 보지 못 했 습 니 다.그리고 그 매개 변 수 는 반드시 되 돌아 가 는 데이터 형식 이 어야 합 니까?문 서 를 여러 번 보 았 지만 안개 투 성 이 였 다.
자바 8 reduce 방법 에서 세 번 째 매개 변 수 는 comber 가 어떤 역할 을 합 니까?
여기 서 답 을 찾 았 습 니 다.Stream 은 병행 작업 을 지원 합 니 다.경쟁 을 피하 기 위해 reduce 스 레 드 에 독립 적 인 result 가 있 습 니 다.combiner 의 역할 은 모든 스 레 드 의 result 를 합병 하여 최종 결 과 를 얻 는 데 있 습 니 다.
이것 은 또한 세 번 째 함수 매개 변수의 데이터 형식 이 반드시 데이터 형식 을 되 돌려 주어 야 한 다 는 것 을 설명 했다.
주의해 야 할 것 은 세 번 째 매개 변 수 는 병행 작업 을 처리 하 는 데 사용 되 기 때문에 데이터 의 중복 성 을 어떻게 처리 하 는 지 많이 고려 해 야 한다.그렇지 않 으 면 중복 데이터 가 나타 날 것 이다!
이상 의 자바 8 시리즈 의 스 트림 에서 만능 reduce 용법 설명 은 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 었 으 면 좋 겠 습 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 8 새 기능 내장 함수식 인터페이스 상세 정보Java 8 새로운 기능 내장 함수식 인터페이스 이전의 블로그 람다 표현식에서 자바 8이 제공하는 함수식 인터페이스를 언급한 적이 있다.이 글에서 자바 8의 가장 기본적인 함수식 인터페이스를 소개할 것이다 방법의 인...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.