【问题标题】:Mono<List<Object>> to List<Object> in JavaJava 中的 Mono<List<Object>> 到 List<Object>
【发布时间】:2021-12-15 16:44:26
【问题描述】:

我无法将Mono&lt;List&lt;Object&gt;&gt; 处理为List&lt;Object&gt;。我在某处读到可以使用flatmap,但我也无法做到这一点。我不想在这种情况下使用.block() 方法。

代码示例可以是:

PagePublisher<Address> someAddressPage = someService.getPagePublisherForAddress();
Mono<List<Address>> addressListMono = 
       Flux.from(someAddressPage.items()).collectList();

我需要从Mono&lt;List&lt;Address&gt;&gt; 获取List&lt;Address&gt;。方法返回类型为List&lt;Address&gt;

我不知道该怎么做,而且我对响应式比较陌生。在这方面需要帮助。

【问题讨论】:

标签: java spring spring-boot reactive-programming spring-webflux


【解决方案1】:

不可能从Mono&lt;List&lt;Address&gt;&gt; 得到List&lt;Address>。如果 List 尚不可用,因为 MonoFlux 本质上是异步/非阻塞的,除非等待它进入,否则您无法获得它,这就是阻塞。

理想情况下,您的方法应返回Mono&lt;List&lt;Address&gt;&gt; 或仅返回Flux&lt;Address&gt;,并且此方法的调用者应订阅结果。由于您使用的是 Spring Webflux,因此完整的链应该是响应式的。

您可以从调用方法订阅Mono,当它可用时,您传递的订阅者将获得List。例如

addressListMono.subscribe(
  addressList -> doSomething(addressList), 
  error -> error.printStackTrace(), 
  () -> Console.out.println("completed without a value")
)

【讨论】:

    【解决方案2】:

    使用block() 实际上是在发出Mono 时从Mono 获取对象的唯一方法。但是,您应该不惜一切代价避免它,因为它违背了使用反应式堆栈的目的,因为它实际上阻塞了等待从Mono 发出对象的线程。

    这意味着在使用响应式编程时,您实际上应该使用MonoFlux,以便您的应用程序真正具有响应式。这样做的结果是您必须将方法的返回类型更改为返回 Mono&lt;List&lt;Address&gt;&gt;

    【讨论】:

    • 我之前做过,但它的响应是“scanAvailable=true”
    • 您需要添加更多代码,以便我们进一步帮助您。 scanAvailable=true 可能对您有意义,但对我们来说毫无意义,您添加到您的问题中的代码如此之少。所以请编辑它并添加更多相关代码。
    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 2018-07-17
    • 2018-12-16
    • 2018-09-22
    • 2022-07-26
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多