flatMap which returns 项和变换的结果
flatMap which returns the item and the result of the transformation
我有一个不太漂亮的 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()
这个链条用相机做点什么。
有没有办法像这样 flatMap
returns 项目及其转换结果 flatMap(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: "));
更多代码来理解我的代码片段:
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());
}
});
}
}
有一个 flatMap
重载,它有一个额外的 Func2<T, U, R>
,它采用原始元素和生成的每个元素 Observable<U>
和 returns 一个要发出的值。
Observable.range(1, 10)
.flatMap(v -> Observable.range(1, 2), (v, w) -> v + 100 * w)
.subscribe(System.out.println);
我有一个不太漂亮的 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()
这个链条用相机做点什么。
有没有办法像这样 flatMap
returns 项目及其转换结果 flatMap(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: "));
更多代码来理解我的代码片段:
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());
}
});
}
}
有一个 flatMap
重载,它有一个额外的 Func2<T, U, R>
,它采用原始元素和生成的每个元素 Observable<U>
和 returns 一个要发出的值。
Observable.range(1, 10)
.flatMap(v -> Observable.range(1, 2), (v, w) -> v + 100 * w)
.subscribe(System.out.println);