자바 8 시리즈 의 Stream 에서 만능 reduce 용법 설명

7852 단어 Java8Streamreduce
reduce 작업 은 Stream 에서 값 을 생 성 할 수 있 습 니 다.생 성 된 값 은 임 의적 인 것 이 아니 라 지정 한 계산 모델 에 따라 생 성 됩 니 다.예 를 들 어 이전에 count,min,max 방법 을 언급 했 는데 자주 사용 하기 때문에 표준 라 이브 러 리 에 포함 되 었 다.사실 이 방법 들 은 모두 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를 받 아들 이 고 이 인 터 페 이 스 는 BiFunction에 계승 되 었 습 니 다.Binary Operator 인터페이스 에서 두 개의 정적 방법 인 minBy 와 maxBy 를 정의 하 였 습 니 다.여기 서 우 리 는 먼저 이 두 가지 정태 적 인 방법 을 상관 하지 않 고 먼저 reduce 의 조작 을 이해한다.

@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 용법 설명 은 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 었 으 면 좋 겠 습 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기