Kotlin:编码讨论:优雅的方式来检查多个变量可能为空

fhity93d  于 2023-04-07  发布在  Kotlin
关注(0)|答案(2)|浏览(197)

我使用Kotlin来编程Android应用程序。为了确保空指针安全,需要检查所有引用是否都是非空的。但是,如果只有一个是空的,那么我们应该通知用户出错了。
对我来说,以简洁易读的方式编程是很重要的。
我正在寻找一个简短而容易理解的解决方案。
标准方法是:

if  (b != null && a != null && c !=null ...) println ("everything ok.")
else println("Something went wrong")
avwztpqn

avwztpqn1#

以下是两种简洁的条件编写方法:

listOf(a, b, c).any { it == null }

listOf(a, b, c).filterNotNull().any()

在上下文中,您可以这样使用它:

println(if (listOf(a, b).any { it == null })) "Something went wrong"
        else "Everything ok.")
kninwzqo

kninwzqo2#

您可以使用Elvis运算符?:,它允许在值为null(包括从函数返回)的情况下提供默认值。
例如:

fun foo(a: Int?, b: String?, c: Boolean?) : String? {
    a ?: return null
    b ?: return null
    c ?: return null
    return "Everything ok."
}

这种方法的优点是,根据哪个值为null,您可以得到不同的错误结果:

  • 使用异常:
fun foo(a: Int?, b: String?, c: Boolean?) : String {
    a ?: throw IllegalArgumentException("a is null")
    b ?: throw IllegalArgumentException("b is null")
    c ?: throw IllegalArgumentException("c is null")
    return "Everything ok."
}
  • 使用不同的返回值:
fun foo(a: Int?, b: String?, c: Boolean?) : Result {
    a ?: return Result.ErrANull
    b ?: return Result.ErrBNull
    c ?: return Result.ErrCNull
    return Result.OK("Everything ok.")
}

sealed class Result {
    class OK(val s: String) : Result()
    object ErrANull : Result()
    object ErrBNull : Result()
    object ErrCNull : Result()
}

相关问题