我是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的正确方法,因此我想知道如何正确执行 .
3 回答
所以你的问题是你的验证函数基本上是一个Observable?太糟糕的过滤器不能接受observable作为谓词 . 您可以对验证函数进行平面映射,但这样做会丢失对评估验证函数的对象的引用 . 但是,您可以使用临时对象来存储对象和验证函数的结果,然后对结果属性进行过滤 .
这是它的外观 . 几个人注意到;
首先,我用基础操作符map,flatmap和filter重写了你的代码以简化它 .
其次,我使用了Observable,但是你可以通过使用Single for isValidGate(...)和Maybe for nearestValidGate(...)来获得更具表现力的函数签名 .
最后,我使用Rx 2但是使用Rx 1它应该主要是相同的 .
Java pre-8中的代码:
和Java 8的版本:
您也可以编写自己的filterWithObservable或filterWithSingle运算符 .
首先,你的第一种方法可以更加简洁地写成:
请注意,如果您将所有Observable视为等效迭代器,则可能不需要toList() .
要过滤掉无效的门,只需使用
filter
运算符:看到?如果不混合集合和Observable,一切都会更容易 .
要根据您的要求发出与给定谓词匹配的第一个项目,您可以使用带有谓词first(Func1<? super T, Boolean> predicate)的运算符
first
或带有默认值的firstOrDefault
和谓词firstOrDefault(T defaultValue, Func1<? super T, Boolean> predicate) .在你的情况下,它可能是这样的: