基于帖子类型,我需要将项目推送到可观察列表。因此,如果未使用if
闭包(例如post.type != SomeType
),我的可观察列表为空。
因此,由于我一直都从NoSuchElementException
收到Single.zip
这是我的示例代码
val observableList = mutableListOf<Single<Response>>()
if (post.type == SomeType) {
observableList.add(addNewObservable()) <-- adding API call to the lsit
}
return Single.zip(observableList) { arg -> arg } <-- Throws error NoSuchElementException
我认为我可以用于post type != SomeType
:
observableList.add(Single.just(Response(""))
这会很好的工作。
那么有更好的解决方案吗?我如何避免该错误?
答案 0 :(得分:1)
如果您的列表可以合法地为空,则可能您希望使用Maybe
而不是Single
。一种方法是
val observableList = mutableListOf<Maybe<Response>>()
...
if (post.type == SomeType) {
observableList.add(addNewObservable().toMaybe())
}
...
return Maybe.zip(observableList) { arg -> arg }
空列表上的 Maybe.zip
应该返回一个Maybe
,它会立即完成而不会发出任何东西。
或替代解决方案:只需在调用Single.zip
之前测试列表是否为空。
这实际上取决于您想要什么行为(除了不引发异常)。
答案 1 :(得分:0)
您需要事先检查是否为空。这可以为 Observable 或 Single 完成。
public Observable<String> zipObservable(List<Observable<String>> strings) {
return strings.isEmpty()
? Observable.just("empty")
: Observable
.zip(strings, objects -> "non-empty");
}
public Single<String> zipSingle(List<Single<String>> strings) {
return strings.isEmpty()
? Single.just("empty")
: Single
.zip(strings, objects -> "non-empty");
}