본문 바로가기
Rx

리액티브연산자 -2( flatMap함수)

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=



flatMap() 함수란 ?

flatMap() 함수는 map() 함수를 좀 더 발전시킨 함수입니다. map() 함수는 원하는 입력 값을 어떤 함수에 넣어서 변환할 수 있는 일대일 함수입니다. 하지만 flatMap() 함수는 똑같이 함수에 넣더라도 결과가 Observable로 나온다는 것이 좀 다릅니다.


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

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


빨간 원을 넣으면 빨간 다이아몬드가 두개 나옵니다. 초록 원을 넣으면 같은방식으로 초록 다이타몬드 2개가 나옵니다. flatMap() 함수는 결괏값이 Observable 이므로 여러 개의 데이터를 발행할 수 있습니다.


또한 위의 마블 다이어그램 에서는 무조건 2개의 데이터를 발행해야 하는 것처럼 보이지만 입력 데이터의 속성에 따라서 1개를 발행할 수도 있고 여러개를 발행해도 무방합니다.

결과값이 Observable 이기 때문입니다.



마블다이어그램을 코드로 작성한예 (flatMap() 함수 활용 예)

Function<String,Observable<String>> getDoubleDiamonds= ball->Observable.just(ball+"<>",ball+"<>");
        
String[] balls={"1","3","5"};
Observable<String> source= Observable.fromArray(balls).flatMap(getDoubleDiamonds);

source.subscribe(Log::i);



Function 인터페이스에 <String, Observable<String>>이라는 제네릭 타입을 선언했습니다.

getDoubleDiamonds() 함수는 ball을 입력받아서 ball+"<>" 을 두번 발행합니다.

다른 Observable과 마찬가지로 다이아몬드를 두번 발행한 다음에는 onComplete 알림을 전달합니다.


Observable<String> 타입인 source는 ball 배열값을 가져온후 getDoubleDiamonds() 함수를 활용해 flatMap() 함수를 호출합니다. 함수형 프로그래밍 에서는 함수가 일급 객체(first class citizen) 입니다. 즉, 함수는 입력값도 될 수 있고, 출력값도 될 수 있고, 함수가 함수를 반환할 수도 있다는 뜻입니다. 현재 예제에서는 flatMap()에 함수를 넣으면 여러개의 데이터가 나올 수 있다는 것을 보여줍니다.


아래는 결과값 입니다.

main | value = 1<>
main | value = 1<>
main | value = 3<>
main | value = 3<>
main | value = 5<>

main | value = 5<>

실행결가는 마블 다이어 그램과는 좀 다릅니다.

 마블 다이어 그램에서는 두번째 초록 다이아몬드가 파란다이아몬드보다 먼저 나왔기 때문입니다. 



이번에는 Function 인터페이스를 사용하지않고 인라인을 람다표현식을 넣는 예제입니다.

flatMap() 함수의 인라인 람다 표현식 예

String[] balls={"1","3","5"};
Observable<String> source= Observable.fromArray(balls).flatMap(ball->Observable.just(ball+"<>",ball+"<>"));

source.subscribe(Log::i);


Function<T, R> 라는 함수형 인터페이스로 분리하지 않고 ,인라인 람다표현으로 넣은 방법입니다.


flatMap()함수의 인자로 Observable 이 다시 나오는 것이 처음에는 어색할 수도있습니다.

위의 코드를 다시보면 Function<String, Observable<String>>입니다 

String을 넣으면 "여러개의 String을 발행하는 Observable이 나오는구나 " 라고 생각하면 됩니다.


RxJava에서 여러개의 데이터를 발행하는 방법은 Observable 밖에 없습니다.

댓글