【问题标题】:flatMap which returns the item and the result of the transformationflatMap 返回项目和转换结果
【发布时间】:2016-08-11 18:09:16
【问题描述】:

我有一个不太漂亮的 RxJava 流程 :-(

RxView.clicks(sendButton)
      .flatMap(ignored -> cameraManager.getCamera())
      .flatMap(camera -> camera.isReachable())
      .filter(reachable -> reachable)
      .flatMap(ignored -> cameraManager.getCamera())
      .flatMap(camera -> camera.sendCommand("foo bar"))
      .subscribe(send -> Timber.i("send successful"),
                 error -> Timber.e(error, "send failed: "));

我不喜欢cameraManager.getCamera() 的这条链用相机做某事。

有没有办法让flatMapflatMap(camera -> Pair.create(camera, camera.isReachable())) 这样返回项目及其转换结果?

RxView.clicks(sendButton)
      .flatMap(ignored -> cameraManager.getCamera())
      .flatMap(camera -> Pair.create(camera, camera.isReachable()))
      .filter(pair -> pair.second)
      .flatMap(pair -> pair.first.sendCommand("foo bar"))
      .subscribe(send -> Timber.i("send successful"),
                 error -> Timber.e(error, "send failed: "));

了解我的sn-p的更多代码:

private class Bar {

    private CameraManager cameraManager = new CameraManager();
    private View          sendButton    = null;

    public Bar() {
        bind();
    }

    private void bind() {

        RxView.clicks(sendButton)
              .flatMap(ignored -> cameraManager.getCamera())
              .flatMap(camera -> camera.isReachable())
              .filter(reachable -> reachable)
              .flatMap(ignored -> cameraManager.getCamera())
              .flatMap(camera -> camera.sendCommand("foo bar"))
              .subscribe(send -> Timber.i("send successful"),
                         error -> Timber.e(error, "send failed: "));
    }
}

private class CameraManager {

    public Observable<Camera> getCamera() {
        return Observable.just(new Camera());
    }
}

public class Camera {

    private BehaviorSubject<Boolean> reachable = BehaviorSubject.create(false);


    public Observable<Boolean> isReachable() {
        return reachable.asObservable();
    }

    public Observable<Boolean> sendCommand(String msg) {
        return Observable.create(subscriber -> {

            // send message...
            final boolean sendSuccessful = true;

            if (sendSuccessful) {
                subscriber.onNext(true);
                subscriber.onCompleted();
            } else {
                subscriber.onError(new Exception());
            }
        });
    }
}

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    有一个flatMap 重载,它有一个额外的Func2&lt;T, U, R&gt;,它采用原始元素和每个元素生成的Observable&lt;U&gt;,并返回一个要发出的值。

    Observable.range(1, 10)
    .flatMap(v -> Observable.range(1, 2), (v, w) -> v + 100 * w)
    .subscribe(System.out.println);
    

    【讨论】:

      猜你喜欢
      • 2020-02-28
      • 2021-05-29
      • 2013-01-17
      • 2014-08-26
      • 2017-07-04
      • 1970-01-01
      • 2015-06-04
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多