首页 > 解决方案 > 在 Koltin 中处理可为空的 val 的最佳方法是什么?

问题描述

我有一个接受可为空字符串的函数,但要求它们为非空。

fun fn(a: String?) {
    if (a == null) {
        logger.warn("a is null, aborting")
        return
    }
    // do something
    fnThatDoesNotAcceptNulls(a)
}

有没有更好的方法来检查值是否为 null 以及return来自 Kotlin 中的函数?

标签: kotlin

解决方案


您可以通过以下方式解决此问题:

  1. 仅使用if(您的版本)
fun fn(a: String?) {
    if (a == null) {
        logger.warn("a is null, aborting")
        return
    }
    // do something
    fnThatDoesNotAcceptNulls(a)
}
  1. 只使用if
fun fn(a: String?) {
    if (a != null) {
        // do something
        fnThatDoesNotAcceptNulls(a)
        return
    }

    logger.warn("a is null, aborting")
}
  1. 使用if(但不记录):
fun fn(a: String?) {
    if (a != null) {
        // do something
        fnThatDoesNotAcceptNulls(a)
    }
}
  1. 使用if-else
fun fn(a: String?) {
    if (a == null) {
        logger.warn("a is null, aborting")
    } else {
        // do something
        fnThatDoesNotAcceptNulls(a)
    }
}
  1. 使用when(带有表达式主体 - 取决于返回类型!):
fun fn(a: String?) = when (a) {
    null -> {
        logger.warn("a is null, aborting")
    }
    else -> {
        // do something
        fnThatDoesNotAcceptNulls(a)
    }
}
  1. 使用“猫王”(?:
fun fn(a: String?) {
    val value = a ?: return
    
    // do something
    fnThatDoesNotAcceptNulls(value)
}
  1. 使用let扩展:
fun fn(a: String?) {
    a?.let {
        // do something
        fnThatDoesNotAcceptNulls(it)
    }
}
  1. 使用扩展(当为空let时处理“否定”情况):a
fun fn(a: String?) {
    a?.let {
        fnThatDoesNotAcceptNulls(a)
    } ?: logger.warn("a is null, aborting")
}
  1. 使用run扩展:
fun fn(a: String?) {
    a?.run {
        // do something
        fnThatDoesNotAcceptNulls(this)
    }
}
  1. 使用扩展(当为空run时处理“否定”情况):a
fun fn(a: String?) {
    a?.run {
        // do something
        fnThatDoesNotAcceptNulls(this)
    } ?: logger.warn("a is null, aborting")
}

私下里,我喜欢选项 5(带有 elvis)和带有扩展的选项。但这一切都取决于情况或情况。


推荐阅读