我有一个元素列表,我想从这些元素中分别发射5个元素,每秒钟/毫秒。
我觉得这应该工作:
Flowable.just(listOf<String>("1","2","3","4","5","6"))
.flatMapIterable { it }
.take(5)
.delay(300, TimeUnit.MILLISECONDS)
.toLiveData()
但是我只能得到最新的元素(在这种情况下为5)。
这是怎么了?
答案 0 :(得分:1)
我认为实现此目的的最佳方法是将字符串列表分成多个列表,最大大小为5个元素,将每个列表concatMap映射为可延迟300毫秒的可流动对象,然后使用concatMapIterable发出每个列表列表中的字符串。我们想在这里使用concatMap而不是flatMap来保留项目的顺序,并确保它们不会同时发出。
科特琳有一个chunked运算符,在这里很有帮助。
Flowable.fromIterable((1..12).map { it.toString() }.chunked(5))
.concatMap { Flowable.just(it).delay(300, TimeUnit.MILLISECONDS) }
.concatMapIterable { it }
.subscribe { println(it) }
这将产生以下输出:
// 300ms
1
2
3
4
5
// 600ms
6
7
8
9
10
// 900ms
11
12