Spring响应式编程之Reactor核心组件

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操作符

相关推荐
To_OC1 小时前
跑了3个Docker容器后,我终于搞懂镜像和容器到底啥关系
后端·docker·容器
东风破_2 小时前
Docker 基础:为什么需要容器?
前端·后端·nginx
葡萄成熟时 !2 小时前
JAVA 常用API学习笔记
java·笔记·学习
东风破_2 小时前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
Lyyaoo.2 小时前
Spring Boot Validation 声明式参数校验
spring boot·后端·mysql
剩下了什么2 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
Rain的Java大神之路2 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
吴声子夜歌3 小时前
Java面试题——基础(一)
java·开发语言
南城以南溫暖如初1474 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
傻啦嘿哟4 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫