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

Refactoring 如何组合两个几乎相似的RxJava方法?,refactoring,rx-java,rx-android,Refactoring,Rx Java,Rx Android,我有两种RxJava风格的方法: void requestFirst() { Observable .combineLatest( api.requestAPI1(), api.requestAPI2(), (result1, result2) -> result1) .map(result -> processResult(result)) .observ

我有两种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));
}
除CombineTest外,这两种方法几乎相同, 我想合并它进行重构。 因此,我编写了以下代码:

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));
}
但我认为CombineTest方法的第二个参数不是Rx的风格。 如何按照Rx的风格合并这两种类似的方法?
谢谢。

您可以添加一个新方法:

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


您可以在
合并后添加
.distinctUntilChange()
,以避免重复处理
api.requestAPI1()
结果。

奇怪的解决方案!首先:它看起来不符合“Rx模式”。次要:在这种情况下,如何处理订阅、需要时取消订阅等。?
void requestNext() {
  processResults(api.requestAPI1());
}
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));
}