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
相关产品推荐
相关产品推荐

