每n毫秒从列表中发射元素

时间:2019-02-28 15:41:19

标签: rx-java2

我有一个元素列表,我想从这些元素中分别发射5个元素,每秒钟/毫秒。

我觉得这应该工作:

   Flowable.just(listOf<String>("1","2","3","4","5","6"))
                .flatMapIterable { it }
                .take(5)
                .delay(300, TimeUnit.MILLISECONDS)
                .toLiveData()

但是我只能得到最新的元素(在这种情况下为5)。

这是怎么了?

1 个答案:

答案 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