使用默认参数不传递任何值给函数

Pass no value to function with default parameters

我有这个 Kotlin 函数:

fun doSomething(user: User = defaultUser) {
  //do something
}

我从另一个地方调用它:

val user: User? = getUser()
if (user == null) {
  doSomething()
} else {
  doSomething(user)
}

是否可以改进此代码?我觉得这个“if/else”有点乱。可以这样做吗?

doSomething(user ?: NoValue)

你可以这样做:

getUser()?.let { // user is not null
  doSomething(it)
} ?: run { // user is null here
  doSomething()
}

(cf: )

我不认为你可以在不让代码难以理解的情况下做更短的事情 编辑 2:实际上你可以,请参阅评论

编辑:我个人会像这样处理函数内的可空变量:

fun doSomething(user: User?) {
  val correctUser = user ?: defaultUser
  //do something
}

所以你可以像这样使用函数:

doSomething(getUser())

您可以将其缩减为 user?.run(::doSomething) ?: doSomething()(如果 doSomething 不 return null)但我不知道您为什么要这样做!

老实说,if/else 对我来说读起来不错,把它放在一行上,没有大括号,它既漂亮又紧凑。不幸的是,我不认为您可以有条件地将参数添加到函数调用中(并且当您有几个参数时,处理默认参数会变得笨拙)。

我同意@benjiii 的观点,如果您不需要将 null 用作合法值,那么拥有一个可为 null 的参数并在内部处理默认值可能会更好

我同意 cactustictacs 的观点,将它放在一行上就很简单明了。然而,如果你经常使用它并且它困扰着你,那么将它包装在一个没有默认参数的函数中就足够了:

fun doSomethingSensibly(user: User?) =
    if (user == null)
        doSomething()
    else
        doSomething(user)

可用作:

doSomethingSensibly(getUser())