由于两次调用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...
很合适。
答案 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()
}
}