Reactor的Flux和mono

发布于:2024-01-19 ⋅ 阅读:(124) ⋅ 点赞:(0)

 `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>`。

本文含有隐藏内容,请 开通VIP 后查看

微信公众号

今日签到

点亮在社区的每一天
去签到