Spring Reactor 响应式编程: 如何使用Mono?
Spring 响应式编程
近些日子在学习有关spring-boot 3 的 新feature ,才了解到除常用的阻塞制servlet外,spring 使用了响应式框架reactor支持的响应式web 编程 , 较之原来的编程方式 ,我个人更加喜欢这种类lamdba 的流式 api,接下来就将会逐章介绍。
什么是 Mono?
在 Spring Reactor 中,Mono 是一个关键的类,用于表示包含零个或一个元素的异步计算。它是响应式编程的基本构建块之一,类似于 Java 8 中的 CompletableFuture,但提供了更丰富的功能和操作符。
创建和使用 Mono
创建 Mono
要创建一个 Mono 对象,可以使用 Mono 类中的静态方法,例如 Mono.just()
或 Mono.empty()
。下面是一些示例:
Mono<String> monoWithJust = Mono.just("Hello, world!");
使用操作符处理 Mono
Mono 提供了丰富的操作符来处理数据流。以下是一些常用的操作符及其示例:
map
: 转换 Mono 中的值。
Mono<String> mono = Mono.just("Hello") .map(s -> s + ", world!");
flatMap
: 处理嵌套的 Mono。
Mono<String> mono = Mono.just("Hello") .flatMap(s -> Mono.just(s.toUpperCase()));
filter
: 过滤 Mono 中的值。
Mono<Integer> mono = Mono.just(5) .filter(num -> num > 0);
defaultIfEmpty
: 在 Mono 为空时提供默认值
Mono<String> mono = Mono.empty() .defaultIfEmpty("Default Value");
onErrorResume
: 处理错误并返回备用值。
Mono<String> mono = Mono.error(new RuntimeException("Error occurred")) .onErrorResume(error -> Mono.just("Recovered from error"));
示例
以下是一个使用 Mono 的完整示例,演示了如何进行异步操作:
Mono<String> mono = Mono.just("Hello") .map(s -> s + ", world!") .flatMap(s -> Mono.just(s.toUpperCase())); mono.subscribe(System.out::println);