`Flux`和`Mono`都是响应式编程模型中的重要概念,它们的区别和使用如下:
1. 区别:
- `Flux`表示一个序列流,它包含多个元素,每个元素可以是基本数据类型(如int、float)、集合(如List、Set)或者自定义对象。
- `Mono`表示一个单播流,它只有一个元素,这个元素可以是基本数据类型、集合或者自定义对象。
- `Flux`适用于处理异步序列数据,而`Mono`适用于处理同步序列数据。
2. 使用:
- `Flux`通常用于处理异步操作,例如网络请求、文件读取等。
```java
Flux<Integer> flux = Flux.range(1, 5)
.flatMap(item -> Mono.fromSupplier(() -> Thread.sleep(500))
.subscribeOn(Schedulers.io()))
.subscribeOn(Schedulers.parallel())
.subscribe(System.out::println);
```
- `Mono`通常用于处理同步操作,例如数据库读写、文件写入等。
```java
Mono<String> mono = Mono.create((Function<? super String, ? extends Publisher<?>>) input -> {
return Flux.just(input)
.flatMap(data -> Mono.fromCompletionStage(() -> CompletableFuture.completedFuture(data)))
.subscribeOn(Schedulers.parallel());
})
.subscribe(System.out::println);
```
`Flux`和`Mono`都是响应式编程模型中的重要概念,它们分别表示异步序列流和同步序列流。在使用时,我们可以将`Flux`和`Mono`相互转换为`List`,以方便我们对序列进行处理和操作。
下面是一个示例代码:
```java
Flux<Integer> flux = Flux.range(1, 5)
.flatMap(item -> Mono.just(item + 1)
.doOnNext(System.out::println)
.subscribeOn(Schedulers.newThread()))
.subscribeOn(Schedulers.parallel());
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
list.add(i);
}
// 将Flux转换为List
List<Integer> fluxList = flux.toList().block();
System.out.println("fluxList: " + fluxList);
// 将List转换为Flux
Flux<Integer> listFlux = Flux.fromList(list)
.doOnNext(System.out::println)
.subscribeOn(Schedulers.newThread());
listFlux.subscribe(System.out::println);
```
在上面的代码中,我们首先定义了一个`Flux<Integer>`,然后将其转换为`List<Integer>`,最后输出`List<Integer>`。接着,我们又定义了一个`List<Integer>`,然后将其转换为`Flux<Integer>`,最后输出`Flux<Integer>`。