如何连接嵌套磁通

时间:2019-11-06 19:42:46

标签: spring-boot kotlin spring-webflux project-reactor

如何将两个流量与一个嵌套流量连接?为什么此代码执行永不结束?

@Test
fun `concatenating two flux`() {

    val names = listOf("israel", "israel")

    val a = Flux.just("a", "v")
            .flatMap { it.toUpperCase().toMono() }
            .concatWith { names.joinToString(" ").toMono() }

    StepVerifier.create(a).expectNext("A", "V", "israel israel").verifyComplete()
}

当我的通量带有单独的变量时,执行将按预期运行

@Test
fun `concatenating two flux`() {

    val names = listOf("israel", "israel")

    val b = names.joinToString(" ").toMono()

    val a = Flux.just("a", "v")
            .flatMap { it.toUpperCase().toMono() }

    val c = a.concatWith(b)

    StepVerifier.create(c.log()).expectNext("A", "V", "israel israel").verifyComplete()
}

1 个答案:

答案 0 :(得分:2)

您需要在()中使用{}的{​​{1}}接口

concatWith()

大多数Rx2方法确实接受实际的lambda,有些方法采用// RIGHT! Flux.just("a", "v") .flatMap { it.toUpperCase().toMono() } .concatWith ( names.joinToString(" ").toMono() ) // WRONG! Flux.just("a", "v") .flatMap { it.toUpperCase().toMono() } .concatWith { names.joinToString(" ").toMono() } 而不是Callable<ObservableSource<T>>,另一些采用ObservableSource

Function<T, ObservableSource<R>>-可以正常工作。

Observable.defer { Observable.just(1) }-也可以按预期工作(如果您故意忽略传入的参数)。

第三个事实是我们习惯了Rx1,它总是将observable.flatMap { Observable.just(1) }用在其Observable方法中,不能表示为lambda,这就是为什么我们需要使用{ {1}}代替andThen()