【发布时间】:2017-10-27 21:18:30
【问题描述】:
场景:RXJava 2. Android。
假设你有一个来自 iterable 的 Observable,如下所示:Observable.fromIterable(arrayList<Something>),你需要用它做两件事:
过滤项目。
知道某个项目是否被过滤掉(又名:过滤器函数至少返回一次 false)。
这是一个类似的 observable(为了相关而极其简化):
final ArrayList<Something> someArrayList = getTheArrayList();
Observable
.fromIterable(someArrayList)
.subscribeOn(Schedulers.computation())
.filter(new AppendOnlyLinkedArrayList.NonThrowingPredicate<Something>() {
@Override
public boolean test(final Something something) {
return something.isValid();
}
})
.toList()
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(new Consumer<List<Something>>() {
@Override
public void accept(@NonNull final List<Something> somethings)
throws Exception {
// How can I tell if the filter above returned false
// at least once?
}
})
.subscribe();
要回答上述问题,一种选择是将原始someArrayList 与somethings 进行比较。如果它们不同,那么,发生了一些事情。但这意味着列表必须以相同的顺序包含相同的项目,如果Something 是一个必须实现等号的复杂对象,这可能会成为问题。
我正在使用但我不喜欢的计划 B 是在可观察对象之外保留一个“布尔数组”,如下所示:
final boolean[] hasInvalidData = new boolean[1];
然后在.filter我可以做到:
final isValid = something.isValid();
if (!isValid) {
hasInvalidData[0] = true;
}
return isValid;
如果成功,我可以这样做:
if (hasInvalidData[0]) {
// Something has been filtered
}
问题是:有没有更好的方法?
更新:
到目前为止,我所做的只是将originalList.size() 与finalEmitedList.size() 进行比较。如果它们不同,则意味着我的过滤器“过滤”了某些东西。
【问题讨论】:
标签: android rx-java observable rx-java2