Java中如何从Mono<T>获取数据?从Mono<Period>提取startDate的正确方法
结论
你编写的这段代码完全不正确,无法正常获取到startDate的值。
错误原因
Mono.subscribe()方法的返回值是Disposable类型,仅用于后续取消订阅操作,和你在回调函数中拿到的startDate没有任何关联,此处强制类型转换会直接抛出ClassCastException。- 响应式流是惰性求值、异步执行的,调用
subscribe后上游的数据库查询不会立刻执行完成,回调逻辑要等查询返回结果后才会触发,同步代码直接取值根本拿不到还未生成的结果。
正确实现方案
方案1:保持响应式链式调用(推荐)
如果你的业务本身运行在响应式环境中,不要强行拆包Mono获取值,直接通过操作符处理流即可:
// 从Mono<Period>映射得到Mono<Date> Mono<Date> startDateMono = periodMono.map(Period::getStartDate); // 在subscribe的回调中处理需要用到startDate的业务逻辑 startDateMono.subscribe(startDate -> { // 此处写业务逻辑,比如存储、打印、传递给其他方法等 System.out.println("获取到的startDate为:" + startDate); });
方案2:同步阻塞取值(仅适配非响应式场景)
如果你的业务是传统同步代码,不得不拿到具体的Date值,可以使用block()方法阻塞等待结果返回:
// 阻塞等待查询结果返回,如果查询无结果则返回null Period period = periodMono.block(); Date startDate = period != null ? period.getStartDate() : null;
注意:禁止在响应式运行环境(比如WebFlux控制器、Reactor调度线程)中调用
block()方法,会造成线程阻塞甚至死锁,这类场景请优先使用链式响应式操作处理数据。
内容的提问来源于stack exchange,提问作者aaaaaajib
相关产品推荐
相关产品推荐

