Reactor核心组件
Flux和Mono组件
Reactor 框架提供了两个核心组件来发布数据,分别是 Flux 和 Mono 组件。两者都是实现Publisher接口的高级抽象,可以说是应用程序开发过程中最基本的编程对象。二者都可以被onComplete
信号或者onError
信号所终止。
(1)Flux组件
表示0到N个元素的异步序列,可以是有限的或无限的。
示例:
创建Flux
java
import reactor.core.publisher.Flux;
public class FluxExample {
public static void main(String[] args) {
// 从静态数据创建
Flux<String> flux1 = Flux.just("Hello", "World");
// 从集合创建
Flux<Integer> flux2 = Flux.fromIterable(Arrays.asList(1, 2, 3, 4, 5));
// 生成动态数据
Flux<Integer> flux3 = Flux.range(1, 10);
// 创建无限流
Flux<Long> flux4 = Flux.interval(Duration.ofSeconds(1));
// 订阅Flux
flux1.subscribe(System.out::println);
flux2.subscribe(System.out::println);
flux3.subscribe(System.out::println);
flux4.subscribe(System.out::println);
}
}
操作Flux
java
import reactor.core.publisher.Flux;
public class FluxOperationsExample {
public static void main(String[] args) {
Flux<Integer> flux = Flux.range(1, 10)
.filter(i -> i % 2 == 0) // 过滤偶数
.map(i -> i * i) // 映射到平方
.doOnNext(System.out::println); // 打印每个元素
flux.subscribe();
}
}
(2)Mono组件
表示0到1个元素的异步序列,通常用于处理单个结果或空结果的情况。
示例:
创建Mono
java
import reactor.core.publisher.Mono;
public class MonoExample {
public static void main(String[] args) {
// 从静态数据创建
Mono<String> mono1 = Mono.just("Hello, Mono");
// 创建空的Mono
Mono<String> mono2 = Mono.empty();
// 创建包含错误的Mono
Mono<String> mono3 = Mono.error(new RuntimeException("An error occurred"));
// 订阅Mono
mono1.subscribe(System.out::println);
mono2.subscribe(System.out::println);
mono3.subscribe(System.out::println, System.err::println);
}
}
操作Mono
java
import reactor.core.publisher.Mono;
public class MonoOperationsExample {
public static void main(String[] args) {
Mono<Integer> mono = Mono.just(10)
.map(i -> i * 2) // 映射到双倍
.doOnNext(System.out::println) // 打印元素
.flatMap(i -> Mono.just(i / 2)); // 扁平映射
mono.subscribe();
}
}
某种程度上可以把 Mono 看作是 Flux 的一种特例,而两者之间也可以进行相互的转换和融合。如果你有两个 Mono 对象,那么把它们合并起来就能获取一个 Flux 对象。除此之外,把一个 Flux 转换成 Mono 对象也有很多办法,例如对一个 Flux 对象中所包含的元素进行计数操作就能得到一个 Mono 对象。
Flux和Mono对象的转换:
java
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public class ConversionExample {
public static void main(String[] args) {
// Mono转Flux
Mono<String> mono = Mono.just("Hello, World");
Flux<String> fluxFromMono = mono.flux();
fluxFromMono.subscribe(System.out::println);
// Flux转Mono
Flux<Integer> flux = Flux.just(1, 2, 3, 4, 5);
Mono<Integer> monoFromFlux = flux.next();
monoFromFlux.subscribe(System.out::println);
}
}
其他相关内容参考:
Spring响应式编程之Reactor介绍
Spring响应式编程之Reactor背压机制
Spring响应式编程之Reactor核心接口
Spring响应式编程之Reactor操作符