[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]
본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다
마블다이어그램참고 - http://reactivex.io/RxJava/javadoc/io/reactivex/Flowable.html#map-io.reactivex.functions.Function-
Map() 은 입력값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수입니다. 마블다이어 그램 보겠습니다.
Map은 입력 데이터와 그것을 변환해줄 함수를 이어주는 중개업자라고 생각하면 됩니다.
그래서 위의 마블 다이어그램을 보면 동그라미를 넣으면 map을 통해 마른모로 변환됩니다.
그럼 구현을 해보겠습니다.
JAVA
public class Map_test {
public static void main(String[] args){
Observable<Integer> observable = Observable.just(1,2,3,4,5).map(number-> {
return number*number ;
});
observable.subscribe(System.out::println);
}
}
Kotlin
fun main() {
var observable = Observable.just(1, 2, 3, 4, 5).map { t -> t * t }
observable.subscribe(System.out::println)
}
결과는
각 갑의 제곱 값이 나옵니다.
즉, 발행된 값들이 map을 통해 제곱이 되고, 구독시점에 출력이 됩니다.
Map의 원형을 보면
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
@CheckReturnValue은 값을 반환한다는 의미고, @SchedulerSupport(SchedulerSupport.NONE)는 스케줄러를 지원하지 않는다는 의미로 현재 스레드에서 실행한다는 뜻입니다. 그리고 Function<? super T, ? extends R>은 T를 인자로 전달받안 R을 반환한다는 의미입니다. 그래서 위의 코드를 변환하면
JAVA
import io.reactivex.Observable;
import io.reactivex.functions.Function;
public class Map_test {
public static void main(String[] args){
Function<Integer, Integer> getSquared = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer*integer;
}
};
Observable<Integer> observable = Observable.just(1,2,3,4,5).map(getSquared);
observable.subscribe(System.out::println);
}
}
Kotlin
import io.reactivex.Observable
import io.reactivex.functions.Function
fun main() {
val getSquared = object : Function<Int, Int> {
override fun apply(num: Int): Int {
return num *num
}
}
var observable = Observable.just(1, 2, 3, 4, 5).map { getSquared }
observable.subscribe(System.out::println)
}
// or
fun main() {
val getSquared = Function<Int, Int> { num -> num *num }
var observable = Observable.just(1, 2, 3, 4, 5).map { getSquared }
observable.subscribe(System.out::println)
}
이렇게 변경할 수 있습니다. (Function은 io.reactivex.functions.Function를 import 해야합니다. java.util.function.Function을 import 해선 안됩니다.)
Map을 만들떄 꼭 입력타입과 반환타입이 같을 필요는 없습니다. String 객체를 받아 Integer 객체를 반환해도 됩니다.
'2023년 이전 > ReativeX' 카테고리의 다른 글
flatMap을 이용한 구구단 만들기 (0) | 2019.11.13 |
---|---|
RxJava,RxKotlin - flatMap() (0) | 2019.11.13 |
RxJava,RxKotlin - Observable (5) - ConnectableObservable (0) | 2019.10.24 |
RxJava,RxKotlin - Observable (4) - Subject (0) | 2019.10.22 |
RxJava,RxKotlin - Observable (3) - Hot/Cold observable (0) | 2019.10.22 |