Kotlin 科特林';s应用与反应堆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

我有一种情况,我无法理解Kotlin在对象上使用的方法。当在apply方法中调用mono对象的方法时,被调用的mono方法根本不响应

未应用的示例(按预期工作):

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