Kotlin中如何将data class实例属性作为参数传入对应函数
Kotlin目前原生没有提供直接将data class实例拆分为多个参数传入函数的语法糖,你可以通过以下几种方式实现需求:
实现方案
方案1:扩展函数(最推荐,符合你期望的调用写法)
直接给Foo加一个接收Params参数的扩展重载,不需要修改原有Foo类的代码,编译期就能做类型检查,无额外性能损耗:
// 扩展函数定义,写在任意kt文件里都可以 fun Foo.doSomething(params: Params) { doSomething(params.param1, params.param2, params.param3) } // 调用方式和你期望的完全一致 val myParams = Params(1, "2", "3") val foo = Foo() foo.doSomething(myParams)
方案2:手动解构传参
如果不想写扩展,也可以直接手动取属性传值,或者先解构data class再传,最直观无额外依赖:
val myParams = Params(1, "2", "3") val foo = Foo() // 直接传参 foo.doSomething(myParams.param1, myParams.param2, myParams.param3) // 或者先解构再传 val (param1, param2, param3) = myParams foo.doSomething(param1, param2, param3)
方案3:反射实现通用execute工具(适合批量适配场景)
如果需要通用的适配逻辑,不想每个函数都单独写扩展,可以用Kotlin反射实现你说的execute工具方法,需要先引入kotlin-reflect依赖:
import kotlin.reflect.KFunction import kotlin.reflect.full.memberProperties import kotlin.reflect.full.valueParameters inline fun <T, reified P, R> execute(instance: T, function: KFunction<R>, params: P): R { // 按参数名匹配参数值,避免顺序不一致导致的传参错误 val paramMap = function.valueParameters.associateWith { param -> P::class.memberProperties.first { it.name == param.name }.get(params) } return function.callBy(paramMap) } // 调用方式 val myParams = Params(1, "2", "3") val foo = Foo() execute(foo, foo::doSomething, myParams)
注意:反射方案参数不匹配会在运行时报错,且有一定性能开销,不适合高频调用的核心链路场景
内容的提问来源于stack exchange,提问作者htafoya
相关产品推荐
相关产品推荐

