Java反应式框架Reactor中的Mono和Flux,2024年最新Java面试精讲

由于响应流的特点,我们不能再返回一个简单的POJO对象来表示结果了。必须返回一个类似Java中的Future的概念,在有结果可用时通知消费者进行消费响应。

Reactive Stream规范中这种被定义为Publisher<T> ,Publisher<T>是一个可以提供0-N个序列元素的提供者,并根据其订阅者Subscriber<? super T>的需求推送元素。一个Publisher<T>可以支持多个订阅者,并可以根据订阅者的逻辑进行推送序列元素。下面这个Excel计算就能说明一些Publisher<T>的特点。

A1-A9就可以看做Publisher<T>及其提供的元素序列。A10-A13分别是求和函数SUM(A1:A9)、平均函数AVERAGE(A1:A9)、最大值函数MAX(A1:A9)、最小值函数MIN(A1:A9),可以看作订阅者Subscriber。假如说我们没有A10-A13,那么A1-A9就没有实际意义,它们并不产生计算。这也是响应式的一个重要特点:当没有订阅时发布者什么也不做

FluxMono都是Publisher<T>Reactor 3实现。Publisher<T>提供了subscribe方法,允许消费者在有结果可用时进行消费。如果没有消费者Publisher<T>不会做任何事情,他根据消费情况进行响应。 Publisher<T>可能返回零或者多个,甚至可能是无限的,为了更加清晰表示期待的结果就引入了两个实现模型MonoFlux

4. Flux


Flux 是一个发出(emit)0-N个元素组成的异步序列的Publisher<T>,可以被onComplete信号或者onError信号所终止。在响应流规范中存在三种给下游消费者调用的方法 onNextonComplete, 和onError。下面这张图表示了Flux的抽象模型:

Flux

以上的的讲解对于初次接触反应式编程的依然是难以理解的,所以这里有一个循序渐进的理解过程。

有些类比并不是很妥当,但是对于你循序渐进的理解这些新概念还是有帮助的。

传统数据处理

我们在平常是这么写的:

public List allUsers() {

return Arrays.asList(new ClientUser(“felord.cn”, “reactive”),

new ClientUser(“Felordcn”, “Reactor”));

}

我们通过迭代返回值Listget这些元素进行再处理(消费),这种方式有点类似厨师做了很多菜,吃不吃在于食客。需要食客主动去来吃就行了(pull的方式),至于喜欢吃什么不喜欢吃什么自己随意,怎么吃也自己随意。

流式数据处理

Java 8中我们可以改写为流的表示:

public Stream allUsers() {

return Stream.of(new ClientUser(“felord.cn”, “reactive”),

new ClientUser(“Felordcn”, “Reactor”));

}

依然是厨师做了很多菜,但是这种就更加高级了一些,提供了菜品的搭配方式(不包含具体细节),食客可以按照说明根据自己的习惯搭配着去吃,一但开始概不退换,吃完为止,过期不候。

反应式数据处理

Reactor中我们又可以改写为Flux表示:

public Flux allUsers(){

return Flux.just(new ClientUser(“felord.cn”, “reactive”),

new ClientUser(“Felordcn”, “Reactor”));

}

这时候食客只需要订餐就行了,做好了自然就呈上来,而且可以随时根据食客的饭量进行调整。如果没有食客订餐那么厨师就什么都不用做。当然不止有这么点特性,不过对于方便我们理解来说这就够了。

5. Mono


小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

ava开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-1T59rUyN-1710970019245)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Flux API和Java Reactor API都是用于响应式编程的工具,其FluxMono是两个核心类。 Flux类代表的是包含0到N个元素的异步序列。这个序列可以包含三种不同的信号:onNext、onComplete、onError。onNext信号表示序列的一个元素,onComplete信号表示序列结束,onError信号表示出现错误。 Mono类代表的是包含0或1个元素的异步序列。它和Flux的区别在于,它要么只有一个元素,要么就是空序列。 WebFlux是Spring 5引入的新的响应式Web框架,它基于Reactor库实现。WebFlux包含两个不同的编程模型:基于注解的模型和函数式编程模型。 下面是一个简单的示例,演示如何使用FluxMono: ```java // 创建一个包含1到10的整数序列 Flux<Integer> flux = Flux.range(1, 10); // 订阅这个序列并输出每个元素 flux.subscribe(System.out::println); // 创建一个包含单个字符串元素的Mono Mono<String> mono = Mono.just("Hello World"); // 订阅这个序列并输出元素 mono.subscribe(System.out::println); ``` WebFlux的应用示例: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public Flux<User> getAllUsers() { return userService.getAllUsers(); } @GetMapping("/users/{id}") public Mono<User> getUserById(@PathVariable("id") String id) { return userService.getUserById(id); } @PostMapping("/users") public Mono<User> createUser(@RequestBody User user) { return userService.createUser(user); } @PutMapping("/users/{id}") public Mono<User> updateUser( @PathVariable("id") String id, @RequestBody User user) { return userService.updateUser(id, user); } @DeleteMapping("/users/{id}") public Mono<Void> deleteUser(@PathVariable("id") String id) { return userService.deleteUser(id); } } ``` 在这个示例,我们创建了一个名为UserController的REST控制器,它包含了五个不同的请求处理方法。每个方法都返回一个FluxMono对象,以实现异步响应式编程。我们还注入了一个名为UserService的服务对象,它提供了所有用户相关的业务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值