Kotlin 科特林';s应用与反应堆Mono不按预期工作
我有一种情况,我无法理解Kotlin在对象上使用的方法。当在apply方法中调用mono对象的方法时,被调用的mono方法根本不响应 未应用的示例(按预期工作):Kotlin 科特林';s应用与反应堆Mono不按预期工作,kotlin,project-reactor,Kotlin,Project Reactor,我有一种情况,我无法理解Kotlin在对象上使用的方法。当在apply方法中调用mono对象的方法时,被调用的mono方法根本不响应 未应用的示例(按预期工作): reactor.core.publisher.Mono .just(1) .doOnSuccessOrError { i, t -> println("doOnSuccessOrError") } .subscribe { println("subscribe: v
reactor.core.publisher.Mono
.just(1)
.doOnSuccessOrError { i, t ->
println("doOnSuccessOrError")
}
.subscribe {
println("subscribe: value=$it")
}
reactor.core.publisher.Mono
.just(1)
.apply {
println("Apply")
doOnSuccessOrError { i, t ->
println("doOnSuccessOrError")
}
}
.subscribe {
println("subscribe: value=$it")
}
它生成控制台输出:
doOnSuccessOrError
subscribe: value=1
Apply
subscribe: value=1
正如所料,首先调用doOnAccessorError(),然后调用subscribe()
应用示例(效果不符合预期):
reactor.core.publisher.Mono
.just(1)
.doOnSuccessOrError { i, t ->
println("doOnSuccessOrError")
}
.subscribe {
println("subscribe: value=$it")
}
reactor.core.publisher.Mono
.just(1)
.apply {
println("Apply")
doOnSuccessOrError { i, t ->
println("doOnSuccessOrError")
}
}
.subscribe {
println("subscribe: value=$it")
}
它生成控制台输出:
doOnSuccessOrError
subscribe: value=1
Apply
subscribe: value=1
现在它不再打印“doOnSuccessOrError”,这与我的预期相反。为什么没有打印出来?这个问题不是Mono特有的,但是我没有使用simpel测试类来概括这个问题。但在阅读之后,我明白了这(当然)是由Mono的不变性引起的,Mono也适用于字符串 所以在这段代码中:
monoObject.apply {
println("Apply")
doOnSuccessOrError { i, t ->
println("doOnSuccessOrError")
}
}
apply返回的对象与monoObject引用的变量相同。
但是由于Mono的不变性,对doOnAccessorError()的调用将返回一个新的Mono对象,该对象与Mono对象所引用的对象不同。由于doOnAccessorError()的结果(一个新的Mono对象)根本没有存储,因此不会调用提供给它的lambda。这就解释了这个问题
一种解决方案是使用Kotlin的,只需将“应用”替换为“运行”。使用
run
而不是apply