当前位置: 首页 > 知识库问答 >
问题:

带磨合kotlin的Elvis操作员

袁桐
2023-03-14

我在这种情况下有点麻烦

a?.let {
    b?.let { }
}?: run { }

问题是,如果"b"为空,运行块将被执行,即使elvis操作符引用了"a"let。我已经试过用"应用"代替"运行",同样的事情发生了

共有1个答案

余弘新
2023-03-14

原因是let函数返回其最后一个表达式。如果最后一个表达式计算为空(如果b为空,或者内部let的最后一行计算为空,则埃尔维斯运算符的第二部分将为评估。

解决方案是永远不要使用Elvis运算符跟踪范围函数调用。它也可以使用而不是let,因为它不会返回lambda结果,但它仍然是一个看起来很钝的代码,很难读取。这是一个如此丑陋的模式,以至于人们会用模因来形容它是多么可笑。

对于这种特殊情况,我将按照如下方式重构您的代码。

val a = a
if (a != null) {
    b?.let {
        //...
    }
} else {
    //...
}

 类似资料:
  • 本文向大家介绍Kotlin 空合并/Elvis运算符,包括了Kotlin 空合并/Elvis运算符的使用技巧和注意事项,需要的朋友参考一下 示例 有时希望以if-else方式评估可为空的表达式。Elvis运算符?:可以在Kotlin中用于这种情况。 例如: 如果 data?.first ()或数据本身产生 null 值,则上面的表达式返回“ Nothing here” ,否则返回 data?. f

  • 我用notnoop java apns推送mdm消息,我试着在主功能中推送消息是可以的!但是,在jetty/tomcat web环境中运行spring mvm时,添加javax。网ssl。SSLHandshakeException:收到致命警报:握手失败!帮助我。 信息[Thread-19]ApnsConnectionImpl。在等待错误代码javax时运行(170)|异常。网ssl。SSLHan

  • 有一些操作符允许你组合两个及以上的 source,它们的行为有所不同,重要的是要知道它们之间的区别。 combineLatest 函数签名如下: Rx.Observable.combineLatest([ source_1, ... source_n]) let source1 = Rx.Observable.interval(100) .map( val => "source1 " + val

  • GraphX中提供的聚合操作有aggregateMessages、collectNeighborIds和collectNeighbors三个,其中aggregateMessages在GraphImpl中实现,collectNeighborIds和collectNeighbors在 GraphOps中实现。下面分别介绍这几个方法。 1 aggregateMessages 1.1 aggregateM

  • 我在Java中经常使用AOP。看起来传统的java方法很容易在Kotlin中重用。鉴于Kotlin强调不变性,JDK代理似乎是Kotlin中最可行的解决方案,前提是您遵循相同的接口优先(在Kotlin中更好地说是特征优先)编程风格,例如: 因此,现在可以很容易地用Spring/AOP编写一个方面,并将其应用到MyServiceImpl实例中。应该提到的是,基于Java接口生成的代理可能更受Kotl