能否在Kotlin中使用Records.mapping?附Java可运行代码示例
在Kotlin中使用Records.mapping的解决方案
可以在Kotlin中使用Records.mapping,但由于Kotlin函数引用与Java函数式接口的适配规则不同,直接照搬Java代码会报错。以下是两种可行的解决方式:
方式一:显式适配Java函数式接口
利用Kotlin的FunctionN接口将构造逻辑转换为jOOQ期望的类型,以构造函数接收4个参数为例:
import kotlin.jvm.functions.Function4 // ... return jooq() .select(ar.ID, ar.FILE_NAME, ar.FILE_PATH, ar.FILE_SIZE) .from(ar) .join(afgsar) .on(afgsar.ATTACHMENT_REFERENCE_ID.eq(ar.ID)) .where(afgsar.ADVANCE_FORM_GENERIC_SECTION_ID.eq(orgId)) .fetch(Records.mapping(Function4 { id, fileName, filePath, fileSize -> AttachmentReferenceFormDto(id, fileName, filePath, fileSize) }))
注意:Function4的泛型参数需与AttachmentReferenceFormDto构造函数的参数类型完全匹配,参数数量根据实际构造函数调整(比如Function3对应3个参数)。
方式二:直接使用Lambda表达式替代
跳过Records.mapping,在fetch方法中直接编写Record到DTO的转换逻辑,这种方式更符合Kotlin的习惯:
return jooq() .select(ar.ID, ar.FILE_NAME, ar.FILE_PATH, ar.FILE_SIZE) .from(ar) .join(afgsar) .on(afgsar.ATTACHMENT_REFERENCE_ID.eq(ar.ID)) .where(afgsar.ADVANCE_FORM_GENERIC_SECTION_ID.eq(orgId)) .fetch { record -> AttachmentReferenceFormDto( record.getValue(ar.ID), record.getValue(ar.FILE_NAME), record.getValue(ar.FILE_PATH), record.getValue(ar.FILE_SIZE) ) }
为什么Java代码可行而Kotlin不行?
Java的构造方法引用AttachmentReferenceFormDto::new可以自动适配jOOQ的RecordMapper等函数式接口,但Kotlin的构造函数引用类型与Java函数式接口无法直接兼容,因此需要显式转换或改用Lambda。
内容的提问来源于stack exchange,提问作者Disheart
相关产品推荐
相关产品推荐

