每n毫秒发出一次列表中的元素

问题描述 投票:2回答:1

我有一个元素列表,我想从中分别发出其中5个元素,每秒数/毫秒。

我觉得这应该工作:

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

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

这里有什么不对?

rx-java2
1个回答
1
投票

我认为实现这一目标的最佳方法是将字符串列表拆分为多个列表,最大大小为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
© www.soinside.com 2019 - 2024. All rights reserved.