如何将协程 Flow<List<T>> 转换为 List<T>

14
如何将 kotlinx.coroutines.flow 列表转换为普通的数据类列表。

4
你无法直接将它转换为列表,但你可以使用collectmap等方法将其作为列表使用。 - Jeel Vankhede
1
如果您的意思是发出一个List<T>一次的Flow,并且您只想要那个列表:someFlow.first() - Joozd
2个回答

25

既然你想要从嵌套列表的流转为单一列表,那么你需要进行平坦映射操作:

suspend fun <T> Flow<List<T>>.flattenToList() = 
        flatMapConcat { it.asFlow() }.toList()

用法示例:

suspend fun main() {
    val flowOfLists: Flow<List<Int>> = flowOf(listOf(1, 2), listOf(3, 4))
    val flatList: List<Int> = flowOfLists.flattenToList()
    println(flatList)
}

如果有的话,我猜这个答案就不需要被写出来了 :) - Marko Topolnik

0

如@JeelVankhede在评论中提到的,您可以使用collect来消耗该流。

例如:

   fun tickets(): Flow<List<Ticket>> {
        return flow {
            // first share whats in db before re-fetching
            ticketDao.selectAllTickets().collect { emit(it) }
            updateTickets()
            emitAll(ticketDao.selectAllTickets())
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接