如何使用kotlin';是否仅当输入不为空时才使用默认参数?

如何使用kotlin';是否仅当输入不为空时才使用默认参数?,kotlin,Kotlin,例如: data class Something(val mendatory: String = "default value") val userInput: String? by SomeTypeOfInputFieldThatReturnsNullable //val something = Something(userInput) //not valid because userInput is String? val something = if (userInput ==

例如:

data class Something(val mendatory: String = "default value")

val userInput: String? by SomeTypeOfInputFieldThatReturnsNullable

//val something = Something(userInput)    //not valid because userInput is String?

val something = if (userInput == null) 
                    Something() 
                else 
                    Something(userInput)

是否有不太详细的方法告诉kotlin仅在参数不为null时传递参数?

取决于您所说的不太详细的意思

一种方法是使用

我让你来决定这是否真的不那么冗长

另一种变体是基本上只将
null
-值传递给
数据类
。通过提供适当的施工人员或适当的工厂职能。以下只是众多变体之一(现在使用和):

然后调用它看起来像:

val something = Something(userInput) // if userInput is String? the companion function is called... if it's String, the constructor is used

// or also using invoke:
val something = Something() // now with s = null, leading to "default value"

我可以想出一些方法,但所有的方法都涉及到某个地方的重复

如果这是唯一需要默认值的地方,则可以将其移出类:

data class Something(val mandatory: String)

val something = Something(userInput ?: "default value")
或者,您可以允许构造函数接受null-但是您需要将可为null的构造函数参数与非null属性分开:

data class Something(mandatoryParam: String?) {
    val mandatory = mandatoryParam ?: "default value"
}

val something = Something(userInput)
或者罗兰在回答中列出了一些选项:在决定调用哪个构造函数时,使用
let
避免重复;或者在伴随对象上使用伪构造函数


因此,没有一个明显的答案。(我想我可能更喜欢我所说明的两种方法中的一种,这取决于默认值是否以任何方式与这个特定的用户输入相关,或者它是否必须应用于对象的构造。)

另一种方法解释了许多解决方案。。。 最好的是:

val something = userInput?.let(::Something) ?: Something()
但如果将“val”改为“var”,还有另一种方法:

data class Something(var mendatory: String = "default value")

val userInput: String? by SomeTypeOfInputFieldThatReturnsNullable

val something = Something().apply { userInput?.let { mendatory = userInput } }

?。
+
当有更多参数时,let
方法开始崩溃,但invoke操作符看起来很有希望!。。。这是基于你的例子…;-)我认为额外的构造函数或工厂函数(
invoke
只是一个变体……您也可以使用“common”函数,例如
fun-something(…参数)
=something(…)`)将在这里帮助您。。。
val something = userInput?.let(::Something) ?: Something()
data class Something(var mendatory: String = "default value")

val userInput: String? by SomeTypeOfInputFieldThatReturnsNullable

val something = Something().apply { userInput?.let { mendatory = userInput } }