본문 바로가기
Rx

리액티브연산자 -5 (reduce함수)

by 봄석 2018. 12. 24.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info



reduce() 함수

상황에따라 발행된 데이터를 취합하여 어떤 결과를 만들어 낼 때는 reduce 계열의 함수를 사용합니다


reduce()함수의 마블다이어그램

출처 - http://reactivex.io/documentation/operators/reduce.html


Observable을 이용해 들어오는 데이터를 1개씩 모아서  최종 결과를 만들어야 할 때 사용한다고 생각하면 됩니다. 주로 수치관련된 계산문제에 활용됩니다.



reduce() 함수의 활용 예

String[] balls ={"1","3","5"};
Maybe<String> source=Observable.fromArray(balls)
            .reduce((ball1,ball2)->ball2 +"("+ball1+")");

 source.subscribe(System.out::println);




실행결과

5(3(1))


Source의 변수는 Observalbe<string>이 아니라 Maybe<String>입니다.
reduce() 함수를 호출하면 인자로 넘긴 람다 표현식에 의해 결과 없이 완료될 수도 있습니다. 따라서 Observable이 아니라 Maybe 객체로 리턴됩니다.

Maybe 클래스 -Single 클래스와 마찬가지로 최대 데이터 하나를 가질 수 있지만

데이터 발행 없이 바로 데이터 발생을 완료(Single 클래스는 1개 완료, Maybe 클래스는 0 혹은 1개 완료)할 수도 있습니다

redube()함수의 원형을 보면 Function 이 아니라 BiFunction 인터페이스를 인자로 활용합니다

public final Maybe<T> reduce(BiFunction<T,T,T> reducer)


람다표현식에서 인자의 개수가 2개 이상일 때는 괄호로 인자 목록을 명시적으로 표현해줘야 합니다.

ball1,ball2)->ball2 +"("+ball1+")"



reduce() 함수의 람다 표현식 분리 예

String[] balls ={"1","3","5","7"};
BiFunction<String,String,String> mergeBalls=
(ball1,ball2)->ball2+"("+ ball1 +")";
                
Maybe<String> source= Observable.fromArray(balls).reduce(mergeBalls);

source.subscribe(System.out::println);


BiFunction<String, String, String>은 인자인 ball1,ball2 및 함수의 리턴 타입이 모두 String 임을 의미합니다.




댓글