【问题标题】:RxJava 2: How to filter items of infinite stream that emits "List<Item>"?RxJava 2:如何过滤发出“List<Item>”的无限流项目?
【发布时间】:2017-07-24 13:28:20
【问题描述】:

我有一个永远不会结束的Observable。它发出一个List&lt;Item&gt;。每次发出该列表时,我都需要过滤掉其中一些项目。目前我有这个作为解决方案:

mData.getItemsObservable() // Observable<List<Item>>
        .compose(...)
        .flatMapSingle(items -> Observable.fromIterable(items)
                .filter(item -> item.someCondition())
                .toList())
        .subscribe(items -> {
            // ...
        }, error -> {
            // ...
        });

这是过滤掉某些项目的最佳方法吗?有没有更简单(更易读)的方法来做同样的事情?

我也试过这个,但它没有发出任何东西:

mData.getItemsObservable() // Observable<List<Item>>
        .compose(...)
        .flatMap(Observable::fromIterable) // or like this: flatMapIterable(items -> items)
        .filter(item -> item.someCondition())
        .toList()
        .subscribe(items -> {
            // ...
        }, error -> {
            // ...
        });

【问题讨论】:

  • 除了使用IxJava之外,第一种方式就是那个。第二个不会完成,因为您展开每个列表项并且它们是无限的; toList 需要像第一种情况的 flatMapSingle 内的有限的。
  • @akarnokd 感谢您的解释。所以如果我理解正确,第一种方法是过滤掉项目的方法?它看起来不如第二种方法。有什么可以改进的吗?谢谢

标签: java android rx-java rx-java2


【解决方案1】:

如果你想坚持RxJava,第一种方法是可以的。否则,您可以使用IxJava 并直接在map 操作中执行过滤:

mData.getItemsObservable() // Observable<List<Item>>
    .compose(...)
    .map(v -> Ix.from(v).filter(w -> w.someCondition()).toList())
    .subscribe(items -> {
        // ...
    }, error -> {
        // ...
    });

【讨论】:

  • 谢谢,我现在会坚持使用 RxJava 并使用第一种方法。我会记住的。
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多