如何结合两个几乎相似的RxJava方法?

时间:2016-11-22 08:39:51

标签: refactoring rx-java rx-android

我有两种RxJava风格的方法:

void requestFirst() {
    Observable
        .combineLatest(
            api.requestAPI1(),
            api.requestAPI2(),
            (result1, result2) -> result1)
        .map(result -> processResult(result))
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe(etc1())
        .doOnSubscribe(etc2())
        .subscribe(
            result -> onComplete(result),
            e -> onError(e));
}

void requestNext() {
    api.requestAPI1()
        .map(result -> processResult(result))
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe(etc1())
        .doOnSubscribe(etc2())
        .subscribe(
            result -> onComplete(result),
            e -> onError(e));
}

除了combineLatest之外,两种方法几乎相同, 我想合并它进行重构。 所以我写下面的代码:

void request(boolean isFirst) {
    Observable
        .combineLatest(
            api.requestAPI1(),
            (isFirst) ? api.requestAPI2() : Observable.empty(),
            (result1, result2) -> result1)
        .map(result -> processResult(result))
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe(etc1())
        .doOnSubscribe(etc2())
        .subscribe(
            result -> onComplete(result),
            e -> onError(e));
}

但我认为combineLatest方法的第二个参数不是Rx的风格。 如何通过Rx的风格合并这两种类似的方法? 谢谢。

2 个答案:

答案 0 :(得分:1)

使用operator .merge()

final Observable tworequestsObservable = Observable
    .combineLatest(
        api.requestAPI1(),
        api.requestAPI2(),
        (result1, result2) -> result1)

void requestNext() {
    Observable.merge(api.requestAPI1(), tworequestsObservable)
        .map(result -> processResult(result))
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe(etc1())
        .doOnSubscribe(etc2())
        .subscribe(
            result -> onComplete(result),
            e -> onError(e));
}

您可以在.distinctUntilChange()之后添加merge,以避免双重处理api.requestAPI1()结果。

答案 1 :(得分:0)

您可以添加新方法:

void processResults(Observable<Source> dataSource) {
    results.map(result -> processResult(result))
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSubscribe(etc1())
    .doOnSubscribe(etc2())
    .subscribe(
        result -> onComplete(result),
        e -> onError(e));
}

并将其用作:

void requestNext() {
  processResults(api.requestAPI1());
}