带你了解Java中的Mono接口
带你了解 Java 中的 Mono 接口在 Java 响应式编程Reactive Programming中Mono是Project Reactor库的核心类型之一。它不是 Java 标准库JDK中的接口而是Reactor Core提供的响应式类型常与 Spring WebFlux、R2DBC 等响应式框架一起使用。Mono 的设计灵感来源于Reactive Streams规范专门用于处理0 或 1 个元素的异步数据流。1. Mono 是什么核心定义Mono是一个PublisherReactive Streams 中的发布者接口。它代表一个异步序列该序列最多发出一个元素onNext然后以onComplete完成或onError错误信号终止。可以发出0 个元素空结果直接完成1 个元素单个值永远不会发出多个元素与 Flux 区别一句话比喻Mono≈ Java 中的OptionalCompletableFuture异步 0/1 值Flux≈ Java 中的Stream或List0 到 N 个元素官方文档定义Reactor 3.xA Reactive Streams Publisher with basic rx operators that emitsat most one itemvia the onNext signal then terminates with the onComplete signal.2. Mono 与 Flux 的区别面试高频维度MonoFlux元素数量0 或 10 到 N可无限适用场景单个结果如查询一条记录、HTTP 返回单个对象多个结果如查询列表、实时数据流类比 Java 类型Optional / CompletableFutureStream / List / Collection常用操作符map、flatMap、then、zipWith、switchIfEmptymap、flatMap、filter、take、merge、zip返回类型通常返回 Mono通常返回 Flux背压支持支持Reactive Streams 标准支持什么时候用 Mono数据库单条查询findByIdHTTP 接口返回单个对象异步计算单个结果如远程调用、文件读取单值组合多个异步操作的最终结果3. Mono 的创建方式常用工厂方法importreactor.core.publisher.Mono;importjava.time.Duration;// 1. 创建有值的 MonoMonoStringmono1Mono.just(Hello, Reactor!);// 2. 创建空 MonoMonoStringmonoEmptyMono.empty();// 3. 从 Supplier 创建延迟执行MonoStringmonoSupplierMono.fromSupplier(()-延迟计算的值);// 4. 从 Callable / Runnable 创建MonoStringmonoCallableMono.fromCallable(()-从 Callable 返回);// 5. 延迟创建延迟指定时间MonoStringdelayedMono.delay(Duration.ofSeconds(2)).map(tick-延迟2秒后返回);// 6. 从 CompletableFuture 转换MonoStringfromFutureMono.fromFuture(CompletableFuture.supplyAsync(()-从 Future 来));// 7. 错误 MonoMonoObjecterrorMonoMono.error(newRuntimeException(出错了));4. Mono 的核心操作符OperatorsMono 支持大量函数式操作符实现声明式编程MonoUseruserMonouserRepository.findById(1L)// 返回 MonoUser.map(user-user.getName().toUpperCase())// 转换.filter(name-name.length()5)// 过滤结果仍为 Mono.flatMap(name-fetchDetail(name))// 扁平化嵌套 Mono.switchIfEmpty(Mono.just(默认用户))// 为空时替换.doOnSuccess(user-System.out.println(成功: user)).doOnError(err-System.err.println(错误: err)).subscribe();// 触发执行常用操作符分类转换map、flatMap组合zipWith、then、and条件switchIfEmpty、defaultIfEmpty副作用doOnNext、doOnError、doOnSubscribe终止then()忽略值返回新 Mono5. 订阅Subscribe与执行Mono 是懒执行Lazy的只有调用subscribe()才会真正开始执行MonoStringmonoMono.just(测试);// 方式1简单订阅mono.subscribe(System.out::println);// 方式2完整处理 onNext / onError / onCompletemono.subscribe(value-System.out.println(收到: value),error-System.err.println(错误: error),()-System.out.println(完成));在 Spring WebFlux 中Controller 方法直接返回MonoT或FluxT框架会自动订阅。6. 实际应用场景Spring WebFlux 示例RestControllerRequestMapping(/users)publicclassUserController{GetMapping(/{id})publicMonoUsergetUser(PathVariableLongid){returnuserService.findById(id)// 返回 MonoUser.switchIfEmpty(Mono.error(newNotFoundException(用户不存在)));}PostMappingpublicMonoUsercreateUser(RequestBodyUseruser){returnuserService.save(user);}}7. 与其他异步类型的转换Mono.fromFuture(CompletableFuture)Mono.fromCallable(...)Flux.fromIterable(list).single()→ 转 Mono期望单个元素mono.as(Flux::from)或flux.single()8. 注意事项 最佳实践不要阻塞Mono 内部操作应保持非阻塞避免block()除非测试。错误处理优先使用onErrorReturn、onErrorResume而不是 try-catch。背压Mono 天然支持背压下游控制上游速率。线程模型默认在当前线程常用subscribeOn/publishOn切换调度器Schedulers。测试用StepVerifierReactor Test测试 Mono/Flux。性能响应式编程适合高并发 IO 场景不适合纯 CPU 密集型计算。Mono vs CompletableFutureMono更丰富的操作符 声明式 支持背压 可取消。CompletableFuture更简单但功能较少。总结Mono是 Reactor 中处理单个异步结果的利器它让异步编程变得声明式、组合式、可读性强。掌握 Mono Flux 后你就能轻松驾驭 Spring WebFlux、响应式微服务等现代 Java 技术栈。想继续深入吗回复以下任意内容我立刻带你继续“Mono 常用操作符 20 例详解 代码”“Flux 完全对比详解”“Spring WebFlux 中 Mono/Flux 实战项目”“Mono 错误处理与重试机制”“StepVerifier 测试 Mono/Flux”“Reactor vs RxJava 对比”“从 CompletableFuture 迁移到 Mono”或者直接说“给我一个完整的 Mono 入门小项目”。有任何疑问随时问我我们一步步把响应式编程学透
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415693.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!