Kotlin中如何针对匹配的实例进行映射操作?
Kotlin中针对List指定类型元素的转换方案
核心结论
Kotlin标准库没有内置的mapIsInstance方法,但可以通过现有API组合或自定义扩展函数实现需求——既保留集合中所有元素,仅对指定类型的data class实例更新部分参数。
方案一:用现有API直接组合实现
不需要额外扩展函数,直接使用map结合类型判断,保留非目标类型元素,仅转换目标类型实例:
documentsResponse .findAll { it.typeOfDocuments == "DONE" } .documentList() .map { item -> // 仅对DataClassItemDto2类型实例执行copy更新,其他元素原样保留 if (item is DataClassItemDto2) { item.copy(uniqueParameters = newValue) } else { item } }
方案二:自定义mapIsInstance扩展函数
如果需要频繁使用这类逻辑,可以封装一个通用的扩展函数,让代码更简洁:
通用扩展函数实现
/** * 对集合中指定类型的元素执行转换,其他元素保持不变 * @param transform 针对目标类型元素的转换逻辑 */ inline fun <reified T> List<*>.mapIsInstance(transform: (T) -> T): List<Any?> { return map { item -> if (item is T) transform(item) else item } }
使用方式
调用时直接指定目标类型,传入转换逻辑即可:
documentsResponse .findAll { it.typeOfDocuments == "DONE" } .documentList() .mapIsInstance<DataClassItemDto2> { it.copy(uniqueParameters = newValue) }
补充说明
你原来的代码filterIsInstance<DataClassItemDto2>().map { ... }会过滤掉所有非DataClassItemDto2类型的元素,而上面两种方案会保留集合中的所有元素,仅更新目标类型的实例,更符合“只更新该data class实例部分值”的需求。
内容的提问来源于stack exchange,提问作者User Unknown
相关产品推荐
相关产品推荐

