【问题标题】:Kotlin avoid smart cast for null checkKotlin 避免使用智能转换进行空值检查
【发布时间】:2020-06-15 18:46:26
【问题描述】:

所以我正在尝试减少此代码并避免来自 IDE 的智能转换提示。 我的想法是我有一个nullable 类型为T 的变量,我想将它映射到R,或者我只是从供应商那里得到R,以防变量是null

我尝试了不同的方法并想出了这个方法。它仍然给了我聪明的演员提示。

fun <T, R> T?.func(mapper: (T) -> R, supplier: () -> R): R =
    when(this) {
        null -> supplier()
        else -> mapper(this) // smart cast
    }

但我不喜欢将其中一个 lambda 表达式括在括号中。例如。

fun foo(value: String?): Int =
    value.func({ it.length + 20}) { 30 }

这可能看起来很奇怪,但在我的上下文中的想法是将变量作为非 nullable 传递给生成 R 的函数或调用生成 R 的函数。

fun bar(value: T?): R =
    when(value) {
        null -> func1()
        else -> func2(value) // smart cast
    }

注意:我读过this,但不一样。

【问题讨论】:

  • avoid smart cast 是什么意思?目的是什么?
  • 这个问题我不清楚,你是在smart cast 还是wrapping of the lambda in parenthesis 的上下文中问的?顺便说一句,您总是可以将两个 lambda 括在括号中,以获得更好的可读性,而不是把一个放在外面。当最后一个参数中只有 1 个 lambda 时,建议将尾随 lambda 放在外面。
  • 如果mapperT的方法,那么你可以将代码缩减为(this?.mapper())?:supplier()
  • 我在上下文中询问是否有更好的方法来避免智能演员并使其更好的可读性?
  • @Venkatesh-PrasadRanganath 是的,我教过这两个问题,但不幸的是,映射器不是T 的方法。

标签: kotlin


【解决方案1】:

以下应该避免智能转换提示

fun <T, R> T?.func(mapper: (T) -> R, supplier: () -> R): R {
    return this?.let { mapper(it) } ?: supplier()
}

【讨论】:

  • 我仍然很好奇避免使用智能演员表的原因。这太难读了。
猜你喜欢
  • 2013-07-01
  • 2022-07-05
  • 2015-10-21
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多