Kotlin回调来自if语句的立即回调

时间:2018-10-01 16:45:42

标签: kotlin

由于两次调用startSync(),这听起来很可笑:

override fun onDataChange(dataSnapshot: DataSnapshot) {
    if (null == dataSnapshot.value) {
        aThing.putAll(defaultConfig)
        dbRef.setValue(botState) { _, _ -> startSync() }
    } else {
        startSync()
    }
}

是否有Kotlin友好的说法:“如果X然后对回调Z()执行Y,否则对立即回调Z()不执行”?但是不必两次拥有Z()。

我来自JavaScript,在这里Promise.resolve().then...很合适。

1 个答案:

答案 0 :(得分:0)

他不想和@yole争论,毕竟他是科特林的成语作者。

但是,如果您真的喜欢JavaScript之类的东西,则可以执行以下操作:

dataSnapshot.value.let {
    if (it == null) {
        ::startSync
    }
    else {
        startSync()
        null
    }
}?.let {
    aThing.putAll(defaultConfig)
    dbRef.setValue(botState) { _, _ ->  it() }
}

但是正如您所看到的,它并不比您的版本短,而且实际上更加混乱。

我认为有时候命令式的方法是正确的。

另一种方法是使用with和方法引用:

with(::startSync) {
    if (dataSnapshot.value == null) {
        aThing.putAll(defaultConfig)
        dbRef.setValue(botState) { _, _ ->  this() }
    }
    else {
        this()   
    }
}