kotlin - 如何在 Kotlin DSL 中设置 Rx Action Consumer
问题描述
我正在研究开发用于命令的Kotlin
DSLRxKotlin
我有一些工作,但是我会改进设置 Rx Action
(s) 和Consumer
(s) 的方法。
我目前拥有的代码类似于:-
@SequenceDsl
class ExperimentalBuilder {
companion object {
private val emptyAction = Action { }
private val emptyConsumer: Consumer<in Throwable> = Consumer { }
}
var uuid: String = ""
var onError: Consumer<in Throwable> = emptyConsumer
var onComplete: Action = emptyAction
var doFinally: Action = emptyAction
var doLoginRefreshFail: Action = emptyAction
fun build(): Experimental = Experimental(uuid, onError, onComplete, doFinally, doLoginRefreshFail)
}
import io.reactivex.Single
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
data class Experimental(
val uuid: String,
val onError: Consumer<in Throwable>,
val onComplete: Action,
val doFinally: Action,
val doLoginRefreshFail: Action
) : Morpheme() {
override fun execute() {
Single.just("")
.subscribeOn(Schedulers.single())
.ignoreElement()
.doOnSubscribe {disposable -> COMPOSITE_DISPOSABLE.add(disposable) }
.doOnComplete(onComplete)
.doOnError(onError)
.doFinally(doFinally)
.doAfterTerminate(doAfterTerminate())
.subscribe()
}
}
我使用此代码如下: -
val experimental = Dsl().experimental {
uuid = "09876"
onComplete = Action {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
onError = Consumer {
throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
}
doFinally = Action {
Log.d("EXPERIMENT", "DO FINALLY")
}
doLoginRefreshFail = Action {
Log.d("EXPERIMENT", "DO LOGIN REFRESH FAIL")
}
}
experimental.execute()
Log.d("DSL", "what $experimental")
我想“改进”的代码是在设置Action
或时Consumer
onComplete = Action {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
onError = Consumer {
throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
}
这是我可以用来设置“onCompile”操作的唯一方法吗?
例如,我必须提及“Action {}”还是有一个“速记”版本我可以使用来达到相同的结果?
解决方案
你可以在 DSL 中定义这样的函数
fun onComplete(onCompleteCallback: ()->Unit) {
onComplete = Action(onCompleteCallback)
}
可以这样使用:
onComplete {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
我希望不会有太多需要它的人
通常 kotlin 可以帮助进行 SAM 转换,但这似乎只真正适用于函数调用,而不是直接设置它时,一旦你可以定义一个函数,你最好确保包装正确完成也考虑制作这些函数inline
推荐阅读
- terraform - Terrform 状态锁无法释放
- dialogflow-es - 使用 postman 在 Google 对话流 V2 API 中创建意图
- javascript - 每个午夜的节点 cron 作业任务
- firebase - 无法检索 Firebase 数据
- java - 使用 Gradle maven-publish 插件将具有子项目依赖项的项目发布到 maven
- reactjs - 在 React (Gatsby) 中将 svg 文件作为道具传递,并且仍然使用 SVGR 和 SVG 作为组件
- javascript - d3 图表开箱即用,最后一个圆圈无法正常显示
- gitlab - Gitlab:获取作业日志时出错
- react-native - 无法在 React-Native 中将图像文件数据发布到 JSON API
- php - 在不同的行中显示数据库中的一列SQL PHP