我在这种情况下有点麻烦
a?.let {
b?.let { }
}?: run { }
问题是,如果"b"为空,运行块将被执行,即使elvis操作符引用了"a"let。我已经试过用"应用"代替"运行",同样的事情发生了
原因是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