这闻起来很有趣,因为两次调用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...
符合要求。
不想和@yole争论,毕竟他是 Kotlin 成语的作者。
但是如果你真的喜欢像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()
}
}