Kotlin列表转换得到List<Kotlin.Unit> 如何正确生成Translation对象列表
问题原因
- 你使用的
map是一对一映射算子,每个输入的Message对象只能对应一个输出元素,无法满足单条Message产出多条Translation的需求 forEachIndexed算子的返回值固定为Unit类型,所以当unlock=true时,你这部分分支的返回值就是Unit,而非你预期的Translation对象,这就是结果中出现kotlin.Unit的直接原因
解决方案
使用支持一对多映射的flatMap算子即可,该算子会将每个输入元素转换为一个Iterable集合,再自动把所有集合的元素平铺合并为最终的结果列表,刚好匹配你的需求。
修正后的代码如下:
val translationList = messages.flatMap { message -> if (message.unlock == "true") { // 遍历内部list生成对应的Translation列表,orEmpty处理list为null的空安全场景 message.list.orEmpty().map { Translation(text = "unlock") } } else { // 单个Translation包装为单元素列表,符合flatMap要求的返回格式 listOf(Translation(text = message.key)) } }
补充说明
根据你给出的Translation类定义,构造函数第一个参数是type,第二个才是文本内容text,所以构造对象时显式指定参数名text = "xxx",避免参数顺序传错。
内容的提问来源于stack exchange,提问作者Robert Jones
相关产品推荐
相关产品推荐

