You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:06:32