RxJava2,如何在每个发射上发射到目前为止所有发射的列表

时间:2019-04-26 12:19:03

标签: rx-java2

我有一个从Observable发出的对象流。

每次都有一个发射,我想将其映射到到目前为止所有发射的列表,

我知道我可以通过存储全局列表并手动进行操作,但是我想知道是否有操作员可以立即进行操作。

a -> [a]
b -> [a,b]
c -> [a,b,c]
a -> [a,b,c,a]
d -> [a,b,c,a,d]
f -> [a,b,c,a,d,f]
b -> [a,b,c,a,d,f,b]
g -> [a,b,c,a,d,f,b,g]

当我使用toList()时。流完成后,它只会发送一个列表。

编辑1: 这是我的流程现在的样子:

source.itemStream()
     .doOnNext( item -> handleItem())
     .subscribe()

我更喜欢的是:

source.itemStream()
     .someOperator() // this will map to a stream of all items so far.
     .doOnNext( item -> handleItem())
     .subscribe()

source.itemStream()
     .compose(x -> listBuildingFunction(x)) // this will map to a stream of all items so far.
     .doOnNext( item -> handleItem())
     .subscribe()

2 个答案:

答案 0 :(得分:1)

将这些项目收集到一个列表中,并发出该列表的副本:

Observable.defer(() -> {
    List<Integer> seen = new LinkedList<>();
    return Observable.range(1, 10)
           .map(v -> {
                seen.add(v);
                return new ArrayList<>(seen);
           });
})
.subscribe(System.out::println);

答案 1 :(得分:1)

使用上述akarnokd的答案,我做了以下工作:(在Kotlin中)

private fun toPartialList(): ObservableTransformer<Item>, List<Item>> {
    return ObservableTransformer { observable ->
        Observable.defer { 
            val tempList = ArrayList<Item>()
            observable.map { item ->
                tempList.add(item)
                return@map ArrayList(tempList)
            }
        }
    }
}

,然后在我的信息流中使用它:

source.itemStream()
     .compose(toPartialList()) 
     .doOnNext { handleItems(it) }
     .subscribe()