如何将Room返回的Flow<List<ObjectDto>>转换为Flow<List<Object>>?
正确实现方式
你完全可以用Flow的map操作符来实现这个转换,这是最简洁高效的做法,不需要手动嵌套flow和collect。
代码示例
override fun getObjects(): Flow<List<Object>> { return objectDao.getObjects() .map { dtoList -> dtoList.map { it.toObject() } } }
为什么你的原有写法没必要
你之前的写法属于冗余操作,因为Flow的map操作符本身就是用来处理转换每个发射值类型的场景:它会自动订阅上游Flow(也就是Room DAO返回的Flow<List<ObjectDto>>),每当上游发射新的列表数据时,就会执行转换逻辑,把List<ObjectDto>转成List<Object>,再传递给下游的收集者,完全不需要手动调用collect再emit。
额外说明
如果后续需要切换线程(比如Room的Flow默认在Dispatchers.IO线程执行查询,若要切换到其他线程可以搭配flowOn操作符),或者处理转换中的异常,可以在map前后添加对应的操作符,但单纯做类型转换的话,map就足够了。
内容的提问来源于stack exchange,提问作者Daantje
相关产品推荐
相关产品推荐

