본문 바로가기

gyub's 공부일기/RxJava

[RxJava] map(), flatMap()

1. map()

map() 함수는 입력값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수입니다!

String을 다른 형태(?)의 String으로 , Integer를 String이나 다른 객체로 변환할 수도 있습니다.

 

map() 함수는 입력 데이터와 그것을 변환해줄 함수를 이어주는 중개업자가 있다고 생각하면 이해하기 쉬울 것 같아여

그림으로도 볼게요 👀

 

 

그림에서 원을 입력받아서 다이아몬드로 출력하고 있죠!

 

다음은 코드로 보시겠습니다. 

balls = arrayOf("1","2","3")
soucre : Observable<String> = Observable.fromArray(balls).map(myball-> myball+"!")
source.subscribe(System.out::println)

// result
// 1!
// 2!
// 3!

 

map() 함수의 원형을 보면

 

이렇게 돼 있습니다. 여기서 @CheckReturnValue는 반환값을 확인한다는 의미이고 @SchedulerSupport(NONE)는 스케줄러를 지원하지 않는다는 의미입니다! 즉, 현재 스레드에서 실행한다는 말이죠

 

RxJava의 람다 표현식은 세 가지 제네릭 함수형 인터페이스 중 하나로 나타내는데요!

- Predicate<T> : t값을 받아서 참이나 거짓을 반환 ( boolean test(T t) )

- Consumer<T> : t값을 받아서 처리하고 반환값은 없음 ( void accept(T t) )

- Function<T,R> : t값을 받아서 결과를 반환 ( R apply (T t) )

 

Function인터페이스는 제네릭 타입 T를 인자로 전달받아 제네릭 타입 R을 반환합니다. 위에 있는(함수 원형 캡쳐 부분) mapper 변수도 T를 인자로 전달받아서 R을 결과로 반환하는 Function 인터페이스입니다.

 

2. flatMap()

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

즉, map() 함수가 일대일 함수라면 flatMap() 함수는 일대다 혹은 일대일 Observable 함수입니다.

 

일단 그림을 보시져

각각의 원을 넣으면 같은 색의 다이아몬드가 두개씩 나오죠! ( 좋겠다...ㅎ;)

flatMap() 함수는 결괏값이 Observable이므로 여러 개의 데이터를 발행할 수 있어요~

하지만 말 그래도 발행할 수!! 있다는 것이므로 한 개만 발행하는 것도 물론 가능합니다!

이 이유는 바로 반환하는 것이 Observable이기 때문이죠

 

이제 다시 코드로 모실게요~

 

balls = arrayOf("1","2","3")
soucre : Observable<String> = Observable.fromArray(balls).flatMap(myBall -> Observable.just(myBall + "!!", myBall + "@@"))
source.subscribe(System.out::println)

// result
// 1!!
// 1@@
// 2!!
// 2@@
// 3!!
// 3@@

이렇게 두 개씩 나오게 됩니다

 

다음 글에선 filter()함수부터 시작합니다.

반응형