我的问题是: 我的代码中有这个方法:
public PublishSubject<Result> getUrl(String requestId) {...}
我有 5 个 url 可以从这个方法中获取,但我需要验证每个 url。如果这 5 个网址正确,那么我可以转到下一个,让我们在应用程序中将其称为状态。
我试图这样做:
mGetAllUrlsDisposable = Observable.zip(
store.getUrl(request1),
store.getUrl(request2),
store.getUrl(request3),
store.getUrl(request4),
store.getUrl(request5),
List::of
).subscribe(
result -> {
boolean allPass = result.stream()
.allMatch(el -> {
if (el.mStatus == Success) {
//Additional code...
return true;
} else {
return false;
}
}
);
if (allPass) {
goToNext();
} else {
terminateApp();
}
},
error -> Log.e(sTAG, "Error."));
但这是错误的代码。我想在订阅者获得值时获得所有结果,然后如果所有结果都得到正确验证,那么我可以进入下一个状态。 我在这里缺少什么? zip() 是正确的使用方法吗?我想不是......但它必须在RxJava中完成。
有什么想法吗?
我不确定这段代码中哪些内容对您不利。如果您使用
allMatch
那么您必须注意:如果不需要确定结果,它可能不会评估所有元素上的谓词。如果您的目的是始终处理所有元素,请改用过滤器:
List<Result> successfulResults = result.stream()
.filter((el) -> {
//...
return el.mStatus == Success
})
.collect(Collectors.toList());
if (successfulResults.size() == 5) {
goToNext();
} else {
terminateApp();
}
zip 就可以了。您还必须注意,如果 PublishSubject 在订阅之前发出数据,它将向 zip 提供数据。