如何在反应式java中从Mono<String>获取String

我有一个接受Mono作为参数的方法。我想要的只是从中获取实际的字符串。Googled,但除了在Mono对象上调用block()之外没有找到答案,但它会发出阻塞调用,所以要避免使用block()。如果可能的话,请建议其他方式。我需要这个字符串的原因是因为在此方法中,我需要调用另一个方法,即使用实际的字符串值说print()。我知道这很容易,但我是反应式编程的新手。

法典:

public String getValue(Mono<String> monoString) {
    // How to get actual String from param monoString
    // and call print(String) method
}

public void print(String str) {
    System.out.println(str);
}

答案 1

从没有阻塞的呼叫中获取一个并不容易,这是不可能的。根据定义。如果 尚不可用(允许),则除非等到它进入,否则您无法获取它,这正是阻止的含义。StringMono<String>StringMono<String>

而不是“得到一个”你到和你通过将得到它何时变得可用(也许立即)。例如:StringsubscribeMonoSubscriberString

myMono.subscribe(
  value -> System.out.println(value), 
  error -> error.printStackTrace(), 
  () -> System.out.println("completed without a value")
)

将打印的值或错误由 (类型 为 ,类型 为 )。在 https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html,您也可以看到其他变体。myMonovalueStringerrorThrowablesubscribe


答案 2

根据文档,您可以执行以下操作:

String getValue(Mono<String> mono) {
    return mono.block();
}

注意阻止呼叫