RxAndroid过滤器可观测<;列表<;项目>&燃气轮机;

RxAndroid过滤器可观测<;列表<;项目>&燃气轮机;,android,rx-java,rx-android,Android,Rx Java,Rx Android,我使用RxAndroid,我想过滤可观察的结果 代码如下: Observable<List<Item>> observable = Observable.create((Observable.OnSubscribe<List<Item>>) subscriber -> { subscriber.onNext(ItemManager.getItems()); subscriber.onCompleted();

我使用RxAndroid,我想过滤
可观察的结果

代码如下:

Observable<List<Item>> observable = 
Observable.create((Observable.OnSubscribe<List<Item>>) subscriber -> {
        subscriber.onNext(ItemManager.getItems());
        subscriber.onCompleted();
    });
但是,
.filter()
强制我实现新的Func1():

observable.filter(新的Func1(){
@凌驾
公共布尔调用(项){
}
});
有人知道如何解决这个问题吗


提前感谢:)

我找到了这个解决方案,但我不知道这是否是一个好方法:

Observable<List<Item>> observable = 
Observable.create((Observable.OnSubscribe<Item>) subscriber -> {
        for (Item item : ItemManager.getItems()) {
            subscriber.onNext(item);
        }

        subscriber.onCompleted();
    })
    .filter(item -> item.isValid());
Observable-Observable=
创建((Observable.OnSubscribe)订户->{
对于(项:ItemManager.getItems()){
订户.onNext(项目);
}
subscriber.onCompleted();
})
.filter(item->item.isValid());

只需使用from函数创建可观察对象:

    Observable<Item> observable = Observable.from(ItemManager.getItems())
    .filter(new Func1<Item, Boolean>() {
        @Override
        public Boolean call(Item item) {
            return item.isValid();
        }
    });

    observable.subscribe(System.out::println);

这样,订阅和对
ItemManager.getItems()的调用将在io线程上执行。

我忘了说ItemManager.getItems()必须异步调用,因为它会进行网络调用:/我真的建议避免
可见。尽可能在任何情况下创建
。@Geralt\u Encore为什么?这是一条很好的建议。如果你用create创建你自己的可观测项目,你必须自己处理错误和完成。好的,我理解。谢谢:)我忘了说ItemManager.getItems()必须异步调用,因为它会进行网络调用:/Updated my answer这样他就不会异步调用
ItemManager.getItems()
,而是异步处理它的结果。抱歉,我没有看到
defer()
调用,+1到您的答案;-)这里有一篇文章详细介绍了使用defer和fromCallable的不同方法和含义
Observable<List<Item>> observable = 
Observable.create((Observable.OnSubscribe<Item>) subscriber -> {
        for (Item item : ItemManager.getItems()) {
            subscriber.onNext(item);
        }

        subscriber.onCompleted();
    })
    .filter(item -> item.isValid());
     Observable.defer(() -> Observable.just(ItemManager.getItems())
            .subscribeOn(Schedulers.io())
            .flatMapIterable(items -> items)
            .filter(item -> item.isValid())
            .toList();
    Observable<Item> observable = Observable.from(ItemManager.getItems())
    .filter(new Func1<Item, Boolean>() {
        @Override
        public Boolean call(Item item) {
            return item.isValid();
        }
    });

    observable.subscribe(System.out::println);
Observable<List<Item>> observable = 
Observable.create((Observable.OnSubscribe<Item>) subscriber -> {
        for (Item item : ItemManager.getItems()) {
            subscriber.onNext(item);
        }

        subscriber.onCompleted();
    })
.filter(item -> item.isValid())
.subscribeOn(Schedulers.io());