【问题标题】:what happen if a flux/mono/Observable never be subscribed如果 Flux/mono/Observable 从未被订阅会发生什么
【发布时间】:2019-10-04 13:32:38
【问题描述】:
public void test(){

     Mono<String> mono = Mono.just("aaa")
     FLux<String> flux = Flux.fromArray()    
     Observable<String> observable = Observable.from(...) 

}

发生了什么测试方法已执行?

  1. 这三个对象都将被 GC 收集?
  2. 如果有操作,就永远不会执行?
  3. 如果上面的问题是否定的,会发生什么?

【问题讨论】:

  • 在您订阅之前什么都不会发生。
  • 在您订阅之前不会发生任何事情。

标签: rx-java2 spring-webflux


【解决方案1】:

为了更好地理解 Flux 和 Mono 的工作原理,您可以将它们想象成管道。当您编写代码时-您不是对数据进行操作,而是仅描述管道完成时数据应该发生的情况。要使管道完整 - 您需要订阅它(这是管道的末端)。

例如这段代码:

Mono sampleMono = Mono.just(1)
    .map(Integer::toString)
    .doOnNext(System.out::println)

在这段代码中,你只会告诉当有人订阅sampleMono 时应该做什么。当有人这样做时 - 然后1 将被发出,映射到字符串并打印到控制台。但它只会在订阅后发生。

这有点像输水管道 - 您可以从井中取冷水并安装热水器。但是,在您使用淋浴或水槽之前,您会得到温水(您需要订阅温水:))。

Mono 和 Flux 是惰性的 - 所以它只会在有人订阅时发出。当然 - 所有代码行都已执行,但它们负责创建“管道”,并且在您订阅之前 - 它们仍然未使用。但也许带有优化器的 java 会做这件事,这些行将从机器代码中完全删除。

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2017-03-26
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多