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

Kotlin中如何根据条件省略函数或构造方法参数?

Kotlin中根据条件省略带默认值的函数/构造方法参数

针对你遇到的问题——不想写大量嵌套if覆盖所有参数组合,同时希望未满足条件时直接使用参数默认值而非传null,可以用以下几种简洁方案解决:

方案1:利用Data Class的copy方法

如果目标是Data Class,先创建默认实例,再通过copy方法仅替换存在的字段:

val capture = ScaleCapture().run {
    copy(
        id = if (jsonObject.has(JSON.ID)) jsonObject.getInt(JSON.ID) else id,
        weight = if (jsonObject.has(JSON.WEIGHT)) jsonObject.getInt(JSON.WEIGHT) else weight
    )
}

data class ScaleCapture(
    val id: Int = 0,
    val weight: Int = 0
)

这种方式无需嵌套判断,未匹配条件的字段会自动沿用默认实例的值,和直接省略参数效果完全一致。

方案2:结合JSON工具类的默认值方法

如果是从JSONObject读取数据,直接用optInt(或对应类型的optXxx方法)指定默认值,避免手动判断:

// 提取默认值为常量,方便统一维护
const val DEFAULT_ID = 0
const val DEFAULT_WEIGHT = 0

data class ScaleCapture(
    val id: Int = DEFAULT_ID,
    val weight: Int = DEFAULT_WEIGHT
)

// 调用时直接复用常量默认值
val capture = ScaleCapture(
    id = jsonObject.optInt(JSON.ID, DEFAULT_ID),
    weight = jsonObject.optInt(JSON.WEIGHT, DEFAULT_WEIGHT)
)

optInt会在字段不存在时返回指定的默认值,写法最简洁,适合简单参数场景。

方案3:DSL构建器(适合多参数场景)

如果参数数量较多,写DSL构建器可以让代码更清晰直观:

data class ScaleCapture(
    val id: Int = 0,
    val weight: Int = 0
)

// 定义构建器类
class ScaleCaptureBuilder {
    var id: Int? = null
    var weight: Int? = null

    fun build(): ScaleCapture {
        return ScaleCapture(
            id = id ?: 0,
            weight = weight ?: 0
        )
    }
}

// 定义DSL扩展函数
fun scaleCapture(block: ScaleCaptureBuilder.() -> Unit): ScaleCapture {
    val builder = ScaleCaptureBuilder()
    builder.block()
    return builder.build()
}

// 调用方式
val capture = scaleCapture {
    if (jsonObject.has(JSON.ID)) id = jsonObject.getInt(JSON.ID)
    if (jsonObject.has(JSON.WEIGHT)) weight = jsonObject.getInt(JSON.WEIGHT)
}

这种方式可以自由添加任意条件判断,未设置的参数会自动使用默认值,参数越多越能体现优势。


内容的提问来源于stack exchange,提问作者moonlightcheese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:50:05