2 回答
TA贡献1817条经验 获得超14个赞
要以最简单的形式直接回答问题,您可以使用Mono.block()
.
但你几乎肯定不应该,因为这会阻塞线程,首先破坏了使用反应堆的意义。相反,您应该调用subscribe()
并提供消费者。当发出一个值时,消费者将被异步调用Mono
,该值作为参数。
当然,没有什么本质上可以阻止您将值分配给一个字段:
mono.subscribe(v -> this.value = v);
...但这在实践中的用处非常有限,因为您不知道该字段何时会被初始化。
更正常的方法是一次性调用订阅者中的其他方法:
mono.subscribe(v -> { oneMethodThatNeedsTheValue(v); anotherMethodThatNeedsTheValue(v); });
...或使用Mono.cache()
并传递它:
class Test {
void useMonoVal(Mono<String> mono) {
mono.subscribe(s -> System.out.println("I need to see " + s));
}
void anotherMethod(Mono<String> mono) {
mono.subscribe(s -> System.out.println("I need to talk to " + s));
}
public static void main(String[] args) {
Mono myMono = Mono.just("Bob").cache();
Test t = new Test();
t.useMonoVal(myMono);
t.anotherMethod(myMono);
}
}
(该cache()方法确保Mono只评估一次,然后为所有未来的订阅者缓存,这在使用just()工厂时当然是无关紧要的,但只是为了一个完整的例子。)
扩展一下,使用反应式范式(因此反应器,并通过扩展它Mono和Flux对象)的全部意义在于它使您能够以非阻塞方式进行编码,这意味着当前的执行线程不会“被阻止” " 等待单声道发出一个值。
旁注:我不确定它是否与问题直接相关,但你不能这样做a.map(System.out::println);- 你可能是说a.subscribe(System.out::println);.
TA贡献2011条经验 获得超2个赞
在从单声道对象获取字符串之前,您必须订阅
public class MonoT {
static String x = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
Mono<String> username = Mono.just("Naren");
username.subscribe(v->{
x = v;
});
System.out.println(x);
}
}
添加回答
举报