我有一个从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()
答案 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()