我有一个元素列表,我想从中分别发出其中5个元素,每秒数/毫秒。
我觉得这应该工作:
Flowable.just(listOf<String>("1","2","3","4","5","6"))
.flatMapIterable { it }
.take(5)
.delay(300, TimeUnit.MILLISECONDS)
.toLiveData()
但我只得到最新的元素(在这种情况下为5)。
这里有什么不对?
我认为实现这一目标的最佳方法是将字符串列表拆分为多个列表,最大大小为5个元素,将每个列表concatMap映射为可流动的,延迟为300毫秒,然后使用concatMapIterable从中发出每个字符串单独列出。我们想在这里使用concatMap而不是flatMap来保存项目的顺序,并确保它们不会同时发出。
Kotlin有一个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