RxJava2
Single에서 FlatMap
사례
Retrofit으로 네트워킹 한 다음 응답값을 하나의 객체로 받았다. 객체 안의 리스트 데이터를 subscribe에서 받으려 한다. 그리고 리스트 데이터 중 전화번호가 없는 것은 걸러내야 한다. 먼저 FlatMap을 사용해야 한다. Single에서는 FlatMap을 바로 사용할 수 없다. 때문에 flattenAsObservable을 사용했고, flatMap이후 filter를 거쳐 toList로 뽑아내면 된다.
코드
network.getResult(this.query, page)
.subscribeOn(Schedulers.io())
.flattenAsObservable(dResult -> {
return dResult.getDocuments();
})
.flatMap(documents -> Observable.just(documents))
.filter(documents -> !TextUtils.isEmpty(documents.getPhone()))
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(items -> {
}));
Debug
디버깅 플러그인이다.
Example
예제가 있다.
Maybe
Maybe는 RxJava2에 처음 도입된 Observable의 또 다른 특수 형태로, Single과 마찬가지로 최대 데이터 하나를 가질 수 있지만 데이터 발행 없이 바로 데이터 발행을 완료할 수도 있다. (Single은 1개 완료, Maybe는 0 혹은 1개 완료) 즉, Maybe는 Single에 onComplete 이벤트가 추가된 형태이다.
데이터 발행자와 수신자
데이터 발행자 | 데이터 수신자 |
---|---|
Observable Single Maybe Subject Completable |
구독자(Subscriber) 옵저버(Observer) 소비자(Consumer) |
리액티브 연산자 분류
연산자 | 설명 |
---|---|
생성(Create) 연산자 | Observable, Single 등으로 데이터의 흐름을 만들어내는 함수 create(), just(), fromArray() 등 |
변환(Transforming) 연산자 | 어떤 입력을 받아서 원하는 출력 결과를 내는 함수 map(), flatMap() 등 |
필터(Filter) 연산자 | 입력 데이터 중에 원하는 데이터만 걸러낸다 filter(), first(), take() 등 |
합성(Combining) 연산자 | 여러 Observable을 조합하는 역할 |
오류 처리(Error Handling) 연산자 | onErrorReturn(), onErrorResumeNext(), retry() 등 |
유틸리티(Utility) 연산자 | 주요 연산자로는 subscribeOn(), observeOn() 등 비동기 지원 |
모든 함수형 연산의 기본이 되는 함수
map()
@CheckReturnValue // 반환값
@SchedulerSupport(value="none") // 스케줄러를 지원하지 않음, 현재 스레드에서 실행
public final <R> Observable(R> map(Function<? super T,? extends R> mapper)
인자
Function<? super T, ? extends R> mapper
flatMap()
map()과 다르게 결과값이 Observable(여러개)일 수 있다.
public final <R> Observable<R> flatMap(Func1<? super T,? extends Observable<? extends R>> func)
public final <R> Observable<R> flatMap(Func1<? super T,? extends Observable<? extends R>> func, int maxConcurrent)
인자
Func1<? super T,? extends Observable<? extends R>> func
filter()
reduce()
RxJava의 제네릭 함수형 인터페이스
인터페이스 이름 | 포함 메서드 | 설명 |
---|---|---|
Predicate |
boolean test(T t) | t 값을 받아서 참이나 거짓을 반환 |
Consumer |
void accept(T t) | t 값을 받아서 처리 |
Function<T, R> | R apply(T t) | t 값을 받아서 결과를 반환 |