Kotlin中从Actions对象列表提取type字段生成字符串列表的实现疑问
解决你的Kotlin集合提取问题
先搞定你当前的代码问题
首先提个小细节:你给出的示例数据里Actions的字段是type,但定义的Actions数据类里却是action字段,这大概率是笔误,我下面会基于数据类的action字段讲解,实际如果是type的话替换即可。
你用map操作符已经正确把List<Actions>转换成了List<String?>(因为action是可空字段),而toCollection()方法需要传入一个MutableCollection的实例,用来把结果存入这个指定集合中,比如:
// 存入ArrayList的写法 val actionList = dataFooter?.actions?.map { it.action }?.toCollection(ArrayList()) // 要是需要可变列表,更简洁的写法是直接用toMutableList() val mutableActionList = dataFooter?.actions?.map { it.action }?.toMutableList()
如果只需要不可变的List,其实map本身就返回了List,完全没必要额外调用toCollection,直接写:
val actionList = dataFooter?.actions?.map { it.action }
这样得到的就是List<String?>?类型的结果。
Kotlin中从对象列表提取目标字段/对象的通用实现方式
在Kotlin里处理这类集合转换需求非常灵活,给你整理几种常用场景:
- 基础map提取单个字段
这是最常用的场景,用map直接将集合元素转换成你需要的字段值:
// 提取可空的action字段 val actions: List<String?>? = dataFooter?.actions?.map { it.action } // 要是想过滤掉null值,加上filterNotNull()就行 val nonNullActions: List<String>? = dataFooter?.actions?.map { it.action }?.filterNotNull()
- 转换为其他自定义对象
如果不是提取单个字段,而是要把Actions转换成另一个自定义对象,同样用map:
data class ActionDTO(val actionType: String) val actionDTOs: List<ActionDTO>? = dataFooter?.actions ?.mapNotNull { it.action?.let { type -> ActionDTO(type) } }
这里用mapNotNull直接过滤掉action为null的情况,同时生成非空的ActionDTO列表。
- 安全处理多层可空场景
如果dataFooter或者actions可能为null,用Kotlin的安全调用?.+?:兜底,可以保证最终得到非空列表:
val safeActionList: List<String> = dataFooter?.actions?.mapNotNull { it.action } ?: emptyList()
这样无论上游是否为null,最终都能拿到一个非空的List<String>。
- 自定义扩展函数复用逻辑
如果这种提取操作在项目中频繁出现,可以定义扩展函数来复用逻辑:
fun List<Actions>.extractActions(): List<String> { return this.mapNotNull { it.action } } // 使用时就很简洁 val actions = dataFooter?.actions?.extractActions() ?: emptyList()
- 用Sequence处理大数据集合
如果你的actions列表特别大,用Sequence的延迟执行特性可以提升性能:
val actionSequence: Sequence<String> = dataFooter?.actions?.asSequence() ?.mapNotNull { it.action } ?: emptySequence() // 最后转换成List val actionList = actionSequence.toList()
内容的提问来源于stack exchange,提问作者WISHY
相关产品推荐
相关产品推荐

