Java反应式编程(1)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~
前面把Java函数式编程的由来和最主要的核心知识点讲完了。包括比较难懂的Lambda表达式是怎么演变而来的也全部都撸了一遍。Lambda表达式这种编程方式的确是让人不太习惯,尤其是之前那种纯面向对象编程的思维模式一旦建立起来之后,想要再接受这种比较奇怪的语法和编程模式,确实是非常困难。但Lambda表达式和流式编程的出现,又催生了另一门新的技术:反应式编程。
《三国演义》中说:“天下大势,分久必合,合久必分”。在科技领域也是一样。之前没有科学的时候,由占星术、炼金术、神学等催生出了一系列的自然科学,像什么物理、化学、数学等等。等到这些学科演变的差不多了之后,又开始了逐步的融合。
反应式编程就和这有点类似,它是融合了Lambda表达式、流式编程和观察者模式的一种新的编程范式。
就像很多反应式编程的技术书、官网和资料里面说的,“一切皆是流”,比如我们其实无时不刻都在呼吸对吧,而且吸入和呼出的都是空气,也就是气流,这个很好理解哈~然后我们的嘴巴会去吃东西,就是食物吧,它也会变成食物流,其他的也是一样,像我们看到的外部的风景啊、人物啊、抖音里面的视频啊,都是视觉流,还有我们和其他人之间的谈话、聊天什么的,都是语音流,而且这种视觉流和语音流很多都是持续的,源源不断的。就像这样:
而且这些流就是我们生活中每天都需要面对的各种各样的事情,比如吃了东西,呼吸了新鲜空气,就会让我们获得能量,就不会觉得饿或者没力气了,或者看到外面漂亮的风景,小哥哥小姐姐,以及美食,或者说和朋友谈话、聊天之后就会觉得很愉快,就能引起心理和生理反应,或者说比如和谁一起吃工作餐谈话,谈的不愉快就直接结束,所以这里有个红叉叉,正常结束的话就是一个竖线,比如这段时间对吃的、帅哥美女、聊天或者抖音都没啥兴趣,走冷淡风,就不再对这些外部事件产生反应了,所谓的反应式编程里面所说的反应,其实就是一种对行为的响应。
如果把代码想象成一个人的话,那么那些外部的事情用计算机专业的话来说叫事件,比如用户点击页面按钮发送消息、键盘输入、物联网设备不断地发送信号等等,都是各种输入流,而且程序需要对这些各种事件都做出响应,或者反应,而且要及时。用以前的方式也是可以的,不过如果这种事件很多,涉及的线程、回调就会很多,所以就需要一种新的编程方式来处理这种叫做mashup的混合式Web应用开发。关于反应式编程的一种正式的描述可以看反应式编程官方的《反应式宣言》:
刚才说的只是反应式编程一些概念性或者是感性的认识,真正要了解反应式编程,还是要看代码:
public static void main(String[] args) { Person person = new Person("zhangsan", 18); // 数据怎么来就怎么处理,处理完后就结束
Observable.just("1", 2, true, 0.618, person, new String("haha"))
.subscribe(System.out::println); }
运行后可以看到,不管是什么样的数据类型,都会被just给展示出来,这就是「流」的概念。而在以前的Java集合List中,肯定是不可能有这种骚操作的。
这种代码示例其实在Reactive的Github官网上面有很多,可以打开它的官网查看:
刚才的代码里面有三个特点:
1、出现了Lambda表达式(System.out::println);
2、出现了流(.just().subscribe());
3、出现了一个叫做Observable的类,而熟悉设计模式的都知道,它是观察者模式中特有的一个类。
下面是观察者模式的一个示意图:
观察者模式也是回调实现的一种方式。观察者模式在开发里面还有另外一个「外号」:发布-订阅模式。经典的观察者模式是像下面这样的:
可以用代码来演示这种剧院和观众的观察者模式:
// 观众的行为(观察者-订阅者接口)
@FunctionalInterface
interface Viewer {
public void watch();
} // 具体订阅者
class ConcreteViewer implements Viewer {
@Override
public void watch() {
System.out.println("正在看表演");
}
}
// 演员(发布者)
class Actor {
// 观众(订阅者)列表
private List<Viewer> viewers = new ArrayList<Viewer>();
// 买票(订阅)
public void buyticket(Viewer viewer) {
viewers.add(viewer);
}
// 退票(取消订阅)
public void refund(Viewer viewer) {
viewers.remove(viewer);
}
// 开始表演
public void play() {
for (Viewer viewer : viewers) {
viewer.watch();
}
}
} /**
* 剧院
*
* @author 湘王
*/
public class Theater {
public static void main(String[] args) {
ConcreteViewer viewer1 = new ConcreteViewer();
ConcreteViewer viewer2 = new ConcreteViewer();
Actor actor = new Actor();
actor.buyticket(viewer1);
actor.buyticket(viewer2);
actor.buyticket(() -> System.out.println("正在VIP包厢看表演"));
actor.play();
}
}
这也是反应式编程的门槛比较高的原因,对于一些没有学过设计模式的同学来说,反应式编程确实很不好理解。这也没办法,因为整个反应式编程的根基就是建立在观察者模式之上的,而且还结合Java9里面的Flow API做了一些改变,有兴趣的同学可以自己去了解一下,所以总结来说的话,反应式编程的特点就是这样的:
用一句简单的话来概括反应式编程 = 函数式编程 + 流式计算 + 观察者模式。
感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~
Java反应式编程(1)的更多相关文章
- Java 链式编程
这里来做一个Java 链式编程的例子,基本就是每次返回一个对象本身,这样就能够去调用对象的方法和属性. package com.sun; public class Demo05 { /** * @pa ...
- Java链式编程接口
在android开发中显示一个AlertDialog时,常采用下列的写法: new AlertDialog.Builder(getApplicationContext()) .setTitle(&qu ...
- java链式编程设计
一般情况下,对一个类的实例和操作,是采用这种方法进行的: Channel channel = new Channel(); channel.queueDeclare(QUEUE_NAME, true, ...
- Java反应式框架Reactor中的Mono和Flux
1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...
- Java9第四篇-Reactive Stream API响应式编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- 使用函数接口和枚举实现配置式编程(Java与Scala实现)
概述 做报表时,有时需要根据不同的业务生成不同的报表.这样,需要能够动态地配置列字段,并根据列字段来输出对应的报表.使用函数接口结合枚举可以比较优雅地实现配置式编程. 问题描述如下: 假设有对象 St ...
- 10-02 Java 形式参数和返回值的问题深入研究,链式编程
形式参数和返回值的问题: 1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该 ...
- Java reactor响应式编程
转载自:https://www.cnblogs.com/lixinjie/p/a-reactive-streams-on-jvm-is-reactor.html 响应式编程 作为响应式编程方向上的第一 ...
- java中的链式编程
听到链式编程听陌生的,但是写出来就感觉其实很熟悉 package test; public class Test { String name; String phone; String mail; S ...
随机推荐
- WebGPU实现Ray Packet
大家好~本文在如何用WebGPU流畅渲染百万级2D物体?基础上进行优化,使用WebGPU实现了Ray Packet,也就是将8*8=64条射线作为一个Packet一起去访问BVH的节点.这样做的好处是 ...
- CSS基础第一篇:图片插入<img>,文本空格
好家伙,这波是被迫回归基础 <img src="" alt=""> img代表"图像",它是图像在页面上显示.src代表&quo ...
- vim编辑器使用详解
Linux之vim编辑器使用 vim三种模式:命令模式,插入模式,退出模式 移动光标操作 左移动一个字符: 按 h 键 右移动一个字符:按 l 键 下移动一行:按 j 键 上移动一行:按 k 键 移动 ...
- FusionCopmpute之CNA,VRM虚拟机安装
CNA和VRM安装步骤一样,需要修改的只有IP 按步骤创建 修改自己虚拟机想要存放的位置 需要把自己网络同样配置为仅主机(提前配好) 自己也可以修改至200G 虚拟机只是用多少取多少 CNA可以设置为 ...
- mysql_阻塞和死锁
什么是阻塞 由于不同锁之间的兼容关系,造成一个事务需要等待另一个事务释放其所占用的资源的现象 称为 阻塞 如何发现阻塞 mysql_8.0 SELECT waiting_pid as '被阻塞的线程' ...
- 深度剖析js闭包
一.什么是闭包? 方法里面返回一个方法 二.闭包存在的意义 延长变量的生命周期 作用域链 沟通内外部方法的桥梁 闭包会常驻内存 ==>慎用闭包 闭包里的变量不会被回收 创建私有环建 例 ...
- 助力培养高质量AI人才,璞公英乐学平台在日本深受好评!
璞公英乐学平台(原名"璞睿魔数")自进入日本市场以来,受到日本用户的广泛好评.近日,日本AI门户网站AIsmiley在发刊的杂志<AI人才育成指南>中对璞公英乐学平台做 ...
- Windows服务器TLS协议
今天在Windows Admin Center里试图安装扩展插件的时候遇到一个问题.在可用插件里没有任何显示,包括各种微软自己开发的插件. 在Feeds里删除默认的链接,重新添加的时候也会遇到报错.说 ...
- 【WPF】实现动态切换语言(国际化)以及动态换肤功能
前言:以下内容,手把手从搭建到最终实现,完成多语言切换以及换装功能. 本地系统环境:win 10 编译器环境:VS2022 社区版 .NET 环境: .NET 6 1.新建一个WPF项目 2.新建完毕 ...
- G&GH05 删除文件和.gitignore
注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...