【发布时间】:2017-02-08 22:36:47
【问题描述】:
我是 RxJava 的新手,所以我在做这种事情时很努力,事情是
我有一个 Observable,它从另一个名为 Gatekeeper 的类发出 List 映射,如下所示:
List<ParkappGate> actualgates = Observable.just(gates).concatMap(new Func1<List<Gatekeeper>, Observable<? extends List<ParkappGate>>>() {
@Override
public Observable<? extends List<ParkappGate>> call(List<Gatekeeper> gatekeepers) {
final List<ParkappGate> gates = new ArrayList<ParkappGate>();
for (Gatekeeper gate :
gatekeepers) {
mDataManager.getGateById(gate.getCode()).subscribe(new Subscriber<ParkappGate>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(ParkappGate gate) {
gates.add(gate);
}
});
}
return Observable.just(gates);
}
});
这工作正常,所以现在我想创建一个 Observable,它只发出在某些条件下列表中有效的第一项,我在这里创建的是这样的:
Observable<ParkappGate> nearestValidGate = actualgates.
concatMap(new Func1<List<ParkappGate>, Observable<? extends ParkappGate>>() {
@Override
public Observable<? extends ParkappGate> call(List<ParkappGate> parkappGates) {
for (ParkappGate gate :
parkappGates) {
if (isValidGate(gate))
return Observable.just(gate);
}
return null;
}
}
我的问题在这里,在验证 ParkappGate 时,我必须调用我创建的一个返回 Observable<ParkappParking> 的方法和另一个返回 Observable 并使用作为参数传递的 ParkappGate 评估它们,然后返回如果全部条件为真或不来自方法isValidGate(ParkappGate gate)
我看到的一种简单方法是使用 toBlocking.first() 将 Observable<ParkappParking> 和 Observable<Boolean> 转换为值,但这似乎不是 Reactive X 的正确方法,所以我想知道如何正确地做到这一点。
【问题讨论】:
-
stackoverflow.com/a/38212879/2450152 这正是您想要做的。使用过滤器和映射方法