【问题标题】:How to transform Flow<T> to Flow<List<T>> in Kotlin?如何在 Kotlin 中将 Flow<T> 转换为 Flow<List<T>>?
【发布时间】:2021-01-25 10:35:22
【问题描述】:

我有一个完整的项目流,比如 Flow。我想将此流程转换为 Flow 并列出所有项目。

我试过了

public fun <T> Flow<T>.toList(): Flow<List<T>> = flow {
    val list = toList(mutableListOf())
    emit(list.toImmutableList())
}

但是这个函数从不发出值

【问题讨论】:

  • 你的意思是要返回一个单一元素的流,它是初始流中所有元素的列表?
  • @Joffrey 是的,是的
  • 这里的toImmutableList() 是什么?这是我唯一需要删除的东西,因为我没有正确复制的库。否则,我认为唯一的问题是名称 toList() 已经存在(实际上您正在使用它)。尝试以不同的方式命名您的函数。
  • @Joffrey 我使用toImmutableList 绝对返回不可变列表。顺便说一句,重命名不起作用
  • 好的,看起来像简单的测试工作。也许是我使用的 flatMapConcat 的问题

标签: kotlin kotlin-flow


【解决方案1】:

如果您真正想要的是一个包含单个 List&lt;T&gt; 元素的流,那么我认为您做对了。 单个元素将是初始流程中所有项目的列表。

我认为您的问题可能是 Flow.toList() 函数已经存在。 尝试不同的命名方式:

fun main(args: Array<String>) = runBlocking {
  val initialFlow = List(5) { it }.asFlow()
  
  initialFlow.toSingleListItem().collect {
      println(it)
  }
}

public fun <T> Flow<T>.toSingleListItem(): Flow<List<T>> = flow {
    val list = toList(mutableListOf())
    emit(list)
}

你可以在这里运行它: https://pl.kotl.in/frCg831WM

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2021-12-29
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-07-14
    • 2022-01-09
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多