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

能否在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:00:26