- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个Mono<String>
react 器中的物体。如何从该对象获取字符串值?
我知道我可以做如下的事情:对于 Mono<String> userName
,我能做到,
userName.map(System.out::println).
但是这会直接打印该值。我想将此字符串值存储到另一个变量中,以便我可以将该变量传递给其他一些函数。我怎样才能提取这个值?
最佳答案
要以最简单的形式直接回答问题 - 您可以使用 Mono.block()
.
但你几乎肯定不应该,因为这会阻塞线程,从而破坏了首先使用 react 器的意义。相反,您应该调用 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
仅评估一次,然后为所有 future 的订阅者缓存,当然,这在使用 just()
工厂时是无关紧要的,但只是为了提供一个完整的示例。)
扩展来说,使用响应式范式(以及 react 器,以及扩展其 Mono
和 Flux
对象)的全部意义在于,它使您能够以非阻塞方式进行编码,这意味着当前的执行线程不会“等待”mono 发出值。
旁注:我不确定它是否与问题直接相关,但您不能执行 a.map(System.out::println);
- 您可能是指 a.subscribe(System.out::println);
。
关于java - 如何从 Reactor 核心中的 Mono<String> 中提取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57353856/
我是一名优秀的程序员,十分优秀!