※ map
: Observable이 발행한 모든 데이터를 Function 객체를 적용해 일괄적으로 바꿔서 Observer에게 전달한다. 다음 예를 보자.
public class main { public static void main(String[] args){ String str1 = "Apple"; String str2 = "Banana"; String str3 = "Boy"; String str4 = "Girl"; Observable.just(str1, str2, str3, str4) .map(new Function<String, String>(){ @Override public String apply(String t) throws Exception { return "String : " + t; } }) .subscribe(new DefaultObserver<String>() { @Override public void onNext(String t) { System.out.println(t); } @Override public void onError(Throwable e) { System.out.println("Error!!!");} @Override public void onComplete() { System.out.println("Complete!!!"); } }); } }
- 결과
위 코드에서 map()에 대해 람다를 적용하면 다음과 같은 코드가 된다.
.map(str-> "String: " + str)
※ flatMap, concatMap, switchMap
: map은 Observable가 Observer에게 전달할 모든 데이터를 변경한다. 즉 map은 데이터들을 반환하는 것이다. flatMap은 데이터가 아닌 Observable이 발행한 데이터에 flatMap에서 기술한 Observable을 적용한다. 다음 예를 보자. flatMap 안에서 Observable을 기술한 걸 볼 수 있다. 처음 Observable이 발행한 str1, str2, str3 각각에 대해서 flatMap에서 기술한 Observable이 적용된다. 결과 사진을 보면 확실히 알 수 있다.
public class main { public static void main(String[] args){ String str1 = "Apple"; String str2 = "Banana"; String str3 = "Boy"; Observable.just(str1, str2, str3) .flatMap(str->Observable.just("1. "+str, "2. "+str, "3. "+str," End")) .subscribe(new DefaultObserver<String>() { @Override public void onNext(String t) { System.out.println(t); } @Override public void onError(Throwable e) { System.out.println("Error!!!");} @Override public void onComplete() { System.out.println("Complete!!!"); } }); } }
- 결과
flatMap을 사용할 경우 데이터의 순서가 보장이 안 된다. 위 예에서는 데이터 순서가 보장됬지만 복잡한 로직을 가지고 있다면 "Banana"가 "Apple"보다 먼저 나올 수도 있다. 이렇게 순서가 중요하다면 concatMap()을 사용하면 된다. switchMap()은 flatMap과 비슷하다. 하지만 위 예에서 switchMap()을 사용하고 1.Banana가 발행되고 1.Boy, 2.Boy, 3.Boy, End가 발행됬다면 1.Banana는 Observer에게 전달되지 않는다.
※ scan
: scan은 Observable이 Observer에 전달한 데이터를 다음에 Observer에 전달할 데이터에 이용한다. 말로는 어려운데 다음 예를 보면 바로 알 수 있다. 결과를 보면 제일 먼저 Observer에 전달된 str1이 scan 내부 sum+str에서 sum에 대입된다. 따라서 Observer에 str1+str2가 전달된다. 이와 마찬가지로 다음에는 str1+str2가 sum에 대입되 str1+str2+str3가 Observer에 전달된다.
public class main { public static void main(String[] args){ String str1 = "Apple"; String str2 = "Banana"; String str3 = "Boy"; Observable.just(str1, str2, str3) .scan((sum, str) -> sum+str) .subscribe(new DefaultObserver<String>() { @Override public void onNext(String t) { System.out.println(t); } @Override public void onError(Throwable e) { System.out.println("Error!!!");} @Override public void onComplete() { System.out.println("Complete!!!"); } }); } }
- 결과
'안드로이드 > Rxjava, RxAndroid' 카테고리의 다른 글
7. RxAndroid - Schedulers(스케줄러) (0) | 2017.08.19 |
---|---|
6. RxJava - merge, zip, conbineLatest (0) | 2017.08.18 |
4. RxJava - repeat, range, filter, distinct, take, first, skip, elementAt, sample (0) | 2017.08.16 |
3. RxJava - DisposableObserver, SingleObserver, CompletableObserver, Maybe (1) | 2017.08.15 |
2. RxJava - Observer와 DefaultObserver 란 (0) | 2017.08.14 |