00:00
各位,刚才呢,我们介绍到了什么是响应式编程,包括通过一段简单的Java代码做了一个基本实现,那我们下面继续咱还是学习这个讲值编程,然后咱下面讲什么呢?给各位做一个说明,就是咱们刚才提到我们用这个web flagx,它就是一个叫做详式编程的这么一个框架,它是一个叫异步非阻塞核心,就是rerector的相A派进行实现的,而我们下面就来讲这个叫rerector,它里边呢相关A派该怎么进行我们的详式编程的编写,包括咱们后面要写代码也是基于这个rewri框架中的API进行实现,所以咱下面就来讲一下这个rewri实现想式编程,给各位做一个说明。我这里强调在rewriter里边呢,有很多相关的内容,而咱们讲的是为了满足我们的web flag使用进行讲解,那我们下面讲这个wri的核心编程,那这个是什么东西,给各位来说一下啊,首先我写第一句话就是在我们这个响应式编程的。
01:18
操作中基本上都要去满足这么一种规范。注意,是一种规范,就是一种规则,而这规则它叫什么呢?它叫做react。满足这么一种规范。而我们现在注意啊,咱们现在使用这个叫rewrite,就是满足这种规范的这么一个框架。而我们的web flagx的核心就是rerier里面API进行实验的,所以咱们现在就讲这个rewri到底该怎么去使用,这是啊我们要说的这么一个内容,然后下面给各位就来说明。
02:05
我这里写第二句话啊,大家记住,在我们的writer里边呢,有两个。核心的类哪两个类呢?一个类叫做mon。还有一个类叫做flags。这两个类注意啊,有这两类,这两个类。他们都怎么样,都继承了,或者说都实现了一个接口,这接口叫publish。这接口各位应该很熟悉啊,咱刚才写那个。JAVA9中看到这个东西,Publish作为那个发布者,或者说这个操作啊,都实验了这个接口,然后这里边我强调,因为咱们后面要写代码中,主要是针对这两类操作,一个叫mono,一个叫这个flags,而这两类什么意思呢?给大家强调,就这两类中呢,他们提供的就是。
03:05
丰富的。这个叫做相关的操作符,能实现我们这个函式编程做法,而这两类的特点是什么?我强调,首先咱看里边这个叫flex。这个类,这个类对象它代表什么呢?就是它能够返回。你的N个元素,将你的这个它就作为数者,它能实现我们这个发布者,我写一下啊,这个对象之间的是。发布者,它可以返回我们的就是N个元素。这个啊是它一个基本的描述,一会儿咱通过代码给各位都会演出来,然后还有一个叫mon,这mon也可以实现。发布者。然后它可以反映什么,就是这个零或者一个。
04:02
元素,这是两个最大的区别,就是你记住flag能返回多个元素,而mon只能返回零,就是空的或者说一个元素,这是啊里面的特点,然后这个说完之后咱继续往下来看啊。就是现在呢,我们通过在这个操作中呢,在这个model BI里边都提供了丰富的API,可以进行我们那个链式编程操作,但是呢,在操作中咱可以指定它用哪个线程就操作,如果你不指定,它默认掉的就是咱们刚才建那方法叫subscript,就是做那个定位的方法,然后在里边进行执行,这个啊是我们提到的这两个对象,一个叫flags,一个叫mono,你把这特点给它先知道。然后这个说完之后,下面呢,给各位我来。画两个图,把这两个特点给大家再解释一下,包括说一下里面一些相关的一些术语。然后咱会就咱代码把这个做一个具体说明。
05:03
那我来说一下啊。就是在这个操作中呢,咱刚才也说到,想着编程里面有个词叫做数据流,而这个flagx和mono都可以发送这种数据信号,它里边包含有这么三种数据信号,那这句话我写一下啊,就这句话我说的过程中呢,大家会觉得里边有很多的术语,这些术语如果说各位不理解没有关系,咱慢慢去理解,因为里边很多东西。比较抽象,咱只有通过具体效果才能更好理解这些东西,那我写一下啊,就这句话,Flags。还有这个。他们都是这个数据流的。这个。发布者就是他们都可以实现这个发布者。然后这里边呢,咱使用这个。Flags。还有这个mon他们都可以发出有三种,这个就是数据的信号,就是通过信号,然后做其他处理,然后这个三种信号分别是什么,给各位来说一下啊,首先里边的第一个它叫做。
06:16
元素值。这好理解,比如你现在是一是二还是三啊,这叫值,第二个叫做错误信号。什么叫错误信号?说的简单点,比如你现在有异常了,是不叫错误信号,还有一个叫完成信号,就是现在这个操作已经结束了,这叫完成信号,而在过程中各位记住错误信号还有完成信号都代表什么?都是终止信号。都代表。我们现在这个操作就是。终止就是它表示这个终止信号。这个啊,各位给他知道,而我们完成信号用于就是终止信号,用于告知你这个定位者该数据流已经结束了。
07:02
终止信号。写一下啊,它用于就是告诉我们那个。订阅者就是你这个数据流已经正常的。结束了,而错误信号呢,它是终止信号,它同时会将错误传递给你的定位者,比如说现在啊,我再说一遍,什么意思啊,这很抽象,就是现在这个flagx和mono,他们都是数据流的发布者,就都可以作为发布者,而使用flagx也好,使用mono也好,都可以同时,就是都可以发出三种数据信号,不是同时啊,而三种信号有元素值,就是你的具体值,比如1234,错误信号,比如说异常了,包括完成信号,但是这里边你要知道错误信号和完成信号都代表终止信号,什么叫终止信号?就是告诉你定位者数据流已经结束了,而错误信号。
08:04
写一下啊,错误信号。它也是终止信号,但是它这过程中会怎么做呢?就是它可以终止。你这个数据流,然后同时把错误的信息会传递给我们的。订阅者,这个啊是里边这个关于它的信号的特点,各位把这给他做个了解,然后这个说完之后,下面给大家画两个图,咱就画一下这个flagx,还有这个mono,它这个就是相关特点,咱提到flagx的发布N个元素,然后这个就是返回N个元素,然后蒙到是返回零到一个元素,那咱们来画一下啊。比如现在我要画这个叫flux。然后在里边,比如现在我这么来画啊,我这位置呢,就画这么一个箭头。
09:01
画个箭头。然后在箭头里边呢,比如现在这位置呢,我画上这么几个,就是具体这些。元素值,比如现在我就画这么几个啊,咱就画这么三个元素值,然后这个位置我再画一条这么一个竖线,那这个值我们就代表我给标个号,比如这是。这是二,这是三,然后这个就是flagx,一个交换特点,而这个特点是什么意思呢?大家看到这里边我这个箭头就表示一个就是时间轴,然后它现在就是连续发送的123有三个表头值,一个完成信号,这里边我这条竖线就代表完成信号,它可以告知定位者现在数据都已经结束了,这就是flax作为特点可以发送N个元束,然后这里边表示它结束,另外给大家画一个,这个叫model。
10:03
Mono什么意思呢?它可以发送零个或者一个这么一个元素,比如现在我要画一下。这个位置有一个箭头,然后这里边会有一个元素。然后这里边是我们那个。终止信号,假如元素值就这个一,这就是model特点。它就是发送了一个移送之后,又发送了一个完成信号,表示数据流已经结束了,它会把这过程告知定位者,数据流结束,这就是flagx和model这么一个基本特点,个位把这给到知道啊,应该并不复杂,你记住这个特点,Flagx n个元素,Mon,零个或者一个元素。咱们画的两个简图。做了一个说明。然后这个说完之后,咱们继续往下来看啊,然后下面看什么呢?给各位这个说明。
11:03
就是现在呢,咱把这个基本概念说完之后,然后下面咱就通过几段代码给大家简单演示一下里面的个特点,因为刚才提到我们的web flux核心是基这个react里面API实验这个显示编程,而在react中两个核心类,一个叫mono,一个叫flux flux返回N个元素,Mon返回零到一个元素,两个都可以作为发布者啊,另外它们信号这个相关特点。那下面咱通过一段代码给各位把这效果咱做一个基本演示。写一下第四个啊,咱就通过代码来演示一下。这个flags,还有这个。那怎么演示给各位,我来做一个具体说明。比如现在啊,咱们还是来到我们这个项目中,在里边呢,首先第一部分咱在这位置,我们先引入这么一个依赖,因为咱用到这个rewri里边需要一个依赖,那我这依赖我就在里边,咱就直接引入一下,我就写到这位置啊,因为这个位置我们基于may刚才提到咱们项目中那个前置知识中有这个ma,然后在里边我写上这么依赖,它应该叫IO点这个。
12:20
啊,应该叫。写一下啊,它叫io.project。这个。Or这个啊。Writer。然后在里边,它那名字应该叫rewrite,这个扣就是核心。下面加上它的版本,比如咱用这个啊,3.1.5啊,用这个版本,这样的话把这依赖我们就引进来了啊,就是这么一个啊。把这咱们加上。就代码演示步骤第一步。引入rewrite那个。这个依赖,然后引用之后,在里边咱就写下这个基本代码,代码很简单,就咱们验证一下flags多个元素,MON0到一个元素。
13:08
咱们来看一下啊,就如这位置我在里边呢,现在我在创建这么一个类,就这个类我就叫test这个。就是他啊。然后在里边我就写一个闷方法,在main方法中,咱们首先用这个flags,用法很简单,我就加一个叫flagx,你看它的包在这个rier。核心包装在flag中呢,有一个最基本方法叫这个just,在just中呢,大家发现看看这个参数。是不是可变参数里边你可加多个值,比如现在我加上就是1234,现在我们通过flex向里边就可以。发送就是多个元素,然后这里边还有一个叫mon,跟他一样点does的,比如里边我加个一,它就发送,就是这么返回一个元素,这个啊就是一个基本的演示,这里边我们就是用了一个最基本方法叫JA子方法,这子方法是一种比较直接的声明数据流的方式,但是里边还有其他方式,就是它有更丰富方法可以做到,那下面给各位也做演示,比如这里边我们基于这个。
14:26
数组或者集合等等方式,咱也可以做这操作。啊,那我来写一下啊。大家写个注释,咱们现在就学这个RI中的核心的语法,或者咱们一会儿用weblex做准备,这些都是基础知识,第一个用里边这个。炸死的方法可以直接去声明我们这个相关的这个元素。然后第二部分咱再用加方法啊,就是其他的方法。那其他方法给各位写一下啊,比如我现在啊,我在里边先给他,就是声明这些数组的这个元素,数组元素进行这么一个传递或者发送,那怎么做呢?咱先看flags里边有个方法,这方法叫做from。
15:14
额瑞,大家看到额瑞是不是数组,然后里边你可以传个数组,比如现在我就定一个数组,然后就来一个。In。有这个数组,我就叫这个葛瑞。等于我们这个数组的值,比如这里边我就写几个,比如这1234,然后把这数组给它放到里边去,这就是声明这么一个数组。这个啊,各位都知道,咱用数组给它进行操作。创建这么一个数组的数据流,然后创建之后,比如现在里边我可以创建一个叫集合,那跟上面类似,我们来一个flax,里边一个方法叫这个from。就是用它,然后用这个可以实现我们操作at able。
16:02
用它用时间,然后在里边我们加上一个。集合来一个叫in。然后那集合起名叫list,比如咱们就是new上一个啊,咱就不new了,直接我这么来写啊,加一个address,点这个s list里边加上我们这个。数组。然后咱们把这集合放到咱这个方法中来list。From啊,用它可以创建或者生明这个集合形式,这种数据流,这个啊,我们给它做到了,然后这个做到之后,在里边也能称为一个就是stream流的方式,那我们来写一下,在flagx里边有个方法,这方法跟上面都一样,它叫from stream里边加上一个stream流,那咱们生面一个stream流。Stream,然后在里边我们加上就来一个半形,就这个int。
17:02
这里边起个名字叫这个stream,等于咱就是写一个list,把它变成我们这个。这个啊,是我们写的这么一个结构,然后咱们把这个stream直接给它放进来,这样的话就声明这么一个stream的这么一种流的方式,这个啊我们做了一个基本说明。啊,这里有个错误啊,这里写错了,应该是list。小写,然后这样的话呢,我们就用其他方法做了一个声明,包括最直接的这个方法,数组的problem。集合到from able,包括这个流的from stream,这样的话啊,咱们用了里边基本方法,把这个最基本效果给各位做演示,就通过演示各位知道这个基本特点,就关于这个flags,还有mono的这个特点。这个啊,给各位拿过来,就是里边的第二步,咱就。
18:03
编写这个代码。把这个做到这样的话啊,咱就做了一个定位演示,然后演示之后咱们继续往下来看啊,看一下它其他方式,我这里提到啊,刚才咱们说的在我们这个不管是flags还是这个mono,它们都可以发送有这么三种信号,但三种信号注意啊,他们并不是一定都要具备的,他们有一些相关的特点给各位我来做个说明,比如里边的。第五句话。咱们来说一下啊,第五部分。给大家说一下,就是三种。信号里边一些相关的特点,首先各位注意啊,就是第一句话。就是这个错误信号和完成信号,咱说的它们代表是不是都是终止信号,但两者不能同时共存,就是里边呢,你不能既有错误信号,有终止信号,因为两个信号都代表我们的这个可以终止这个啊,是我们说的第一个啊。
19:09
然后写一下。我想这位置就是第一句话这个错误信号。说的延点啊,还有一个叫完成信号,它们都是这个终止信号,但是他们是不能。共存的,这是第一句话,然后这里边强调啊,就是如果说啊,你没有发出任何元素值,而是直接发出一个完成的错误信号,那就表示它是一个空的数据流。什么意思呢?比如我现在这里边,我没有前面这个值,只有一个完成型号,或者说有一个错误型号,那表示目前是一个空的数据流,这应该好理解,直接完成里面没有值就是空的,然后另外如果说我们现在没有错误信号,也没有成信号,那我现在这个数据流那就是无限的可以一直执行下去啊,这个啊是咱说的另外两个特点。
20:04
我在里边写一下第二句话,如果说咱没有发送。任何的这么一个。元素值,而这里边而是直接发送这个错误。或者这个完成。信号,那就表示我现在是一个空的一个数据流。然后最后一句话,就刚才我说到的,如果说我现在没有错误信号。也没有这个完成信号,那表示它是一个叫无限的这么一个数据流,这是关于啊三种信号,它里边一些相关特点,咱们把这个给各位做了一个说明啊,各位大家知道啊,然后刚才提到一个叫。错误信号,那错误信号怎么发呢?其实就是咱们new一个except一个异常,就是我写一下啊,在我们的这个。
21:07
Flagx或者model里面都有一个方法,就叫什么A种A里边呢,你nu个exception里面加一条信息,这样的话就有个错误型号啊,就是这么一个基本发送,所以这个啊是关于里边一些最基本的语法,各位把这给到知道啊。然后这里边啊,我们现在就把这个做了一个说明,就关于这个flags和这个model中一些最基本的语法,通过我的演示,各位把这特点给他知道,但是这个过程中呢,就是咱们刚才讲到那个JAVA9或者JAVA8的一个特点,它们特点都是一样的,就是现在你说这过程中,因为它叫。响应式编程,在你做响式编程中,如果说你现在不进行订阅,它肯定是不会进行任何的输出的,那比如说给各位演示一下啊,比如现在我就以上面为例,你和我向上面。
22:02
Flag里边有四个元素,Model里边有一个元素,而我现在把它做一个输出,比如现在我一运行这个程序来看它有什么特点。大家看只有一段日志是没有输出,而我现在为什么没有输出,因为你现在没有进行订阅,你只有订阅之后才能进行输出,那怎么订阅,咱们写一下,在里边有个方法,就咱建立方法叫subscript的,然后在里边咱可以给他做输出,比如里边用那个。这二八的写法啊,我来一个system。Out,然后冒号加上这个print,这样的话就把它做了这么一个输出。这个啊,就给他进行了一个订阅,包括下面这个跟他一样,我们也是做个订阅。把这个写一下啊,然后写完之后,最终我们做一个执行,咱们看一下这个特点,大家看,哎,我这个位置应该做一个,看来做一个换行就可以了,咱们换行也看到1234,后面是一,现在是不是输出了,所以各位记住这个特点啊,我们现在不管你是用flagx还是model调这JA的方法或者其他方法也好,它仅仅是声明这个数据流,而此时数据流元素并没有发出,只有当你调这个叫sub three这个方法,就是你调这个订阅方法之后,才会触发注意流,所以说当你在没订阅之前,它是什么都不会发生的,这是里边的这么一个特点。
23:35
我把这个代码给各位截过来,然后这句话给各位写一下啊。就是里边的。第六句话。写一下就是我们现在。调用这个just。或者。其他的方法。你现在只是声明了这个数据流,但是现在你这个数据流它并没有。
24:06
进行这么一个发出,就并没有发出这个数据流,而我现在只有说你进行了订阅之后。他才能够就是才会触发。这个数据流你不订阅。注意,不订阅它是什么都不会。发生的这一个特点,而怎么订阅,咱刚才也说到了,我们调这个subscript方法做一个订阅,这个啊大家把这个记住,所以现在咱就说了这个reri里边的核心编程,主要讲到了flex,还有这个mono,两个这个核心类,一个是对应返回N个元素,一个对应返回这个零的一个元素,这个啊我们就说完了。然后这些都出完之后呢,在我们的rewrite中呢,还有最后一部分可以内容,这份内容咱后面代码会写到,给各位也做个说明,就是第七步内容,关于reri中一些叫操作符的一些操作。
25:11
那操作符什么叫操作符,给大家解释一下啊,我就举一个比较通俗的例子啊。给大家注意,首先我比如说我们现在啊,对于数据流在它发送过程中,这过程中对于数据流我们肯定要进相应的各种处理,它就好比说我们在电视上或者在市一中,咱能见个地方叫工厂那个流水线。我应该都见过,比如说流水线上是干什么,比如现在我拿一个原料,从你流水线的入口进入,在过程中经过多道工序的加工,最终出来是一个成品,而这过程将与我们现在做这个操作服务,它就是对我这个数据流进行各种加工,最终得到我们想的结果,而流水线上的一道道工序就相当于我们现在这个操作服务,这个啊是一个描述,就对应的数据流进行各种的处理,就能得到你想的结果,这个就叫操作符。
26:13
我写一下啊,对我们的数据流进行就是。一道道的这么一个操作。这个一道道操作就称为这个操作符,比如说我们那个工厂的。流水线就是一个典型的操作福例子,因为最终你把原料进入,要得到你的成品,这个啊,操作服,而操作服中呢,在这个reactor中有很多,我给大家介绍两个,最常见的就是咱们后面要用到操作符,但我强调啊,操作符的代码并不复杂,主要这个思路它比较抽象,希望各位尝试去理解,如果还不理解,咱后面会写这个,具体这个。外部法功的案例给各位会再做一个说明,那我们来说一下操作符。
27:04
首先我们说第一个常见的,然后再说第二个常见的,第一个常见操作谱,它叫map。然后第二个操作符叫flight map,这是两个比较常见的,也是咱们后面要用到的。那这两个什么意思,给各位来说一下啊,首先看第一个叫map,它什么意思,就是现在我们要把我们这个。元素。映射为你的新的一个元素,这叫map,然后里边还有一个叫flat map,它什么意思?它就表示把你的元素映射为你的流。啊,这是两个内容,那什么意思,我们先看这个map,看它是什么意思,给各位啊做个说明。那来强调啊,它的含义是什么,比如现在啊,我们操作中,那我下面呢,给各位我来举一个具体例子啊,咱们来做个说明,那咱们啊,这个位置我们先看这么一个地方。
28:07
咱们看一下啊,我这里面一张图,就关于这个map的操作符,它是什么意思呢?咱看这张图上啊。在这张图上呢,就是上方的箭头表一个时间轴,下方是经过处理之后数据序列,那个时间轴就是现在,你看我现在有这么几个元素,然后我元素经过我的map出力之后变成一个新的元素,就这个特点,举个例子啊,比如我现在这几个元素是1233个元素,它们的值就是123,而我经过map想做操作,我想把123每个值做一个,就是就是可以说就是相乘的操作,比如给它做一个平方的操作,那我一平方还是一,二平方变成四,三平方变成六,这是不是就变成了新的元素,这过程就是map要做的事情。
29:01
给各位啊,我进一步来说一下啊,就是现在我给大家画个图。把这个map到底干什么说一下,就是把你的元素变成个新的元素,假如我现在三个元素值就是这个一,这是二,这是三,而我经过map map里边的,比如说现在我想做个操作,让这值。做一个平方的操作,比如这个值,假如说变量是I,让我让I乘以I,那它做了平方操作之后,它的新元素是发生变化,一的平方是一,二的平方是四,三的平方变成是不是九啊,是九,这样的话,咱们做就是麦克做的事情,把你的元素变成新的元素。啊,就是这么一个基本特点,各位把这个他知道啊,咱说的map这么一个运算符。这个图给各位截过来,大家把这个头要知道啊,包括咱们一会儿再用。
30:02
We代码中会写到这个运算符叫map,然后除了map之后呢,下面我们还要运算符,它叫Fla map,那flat map是什么意思,给各位做个说明,那这里边还有一张图,这张图那么它打开我们来看一下啊,这个图什么意思?给各位。截过来啊。然后咱们看啊,大家看跟刚才类似flag map什么意思呢?它就可以将每个元素映射为一个流,或者转换为一个流,然后把这流合并成一个大的数据流,进行这么一个返回,这个叫flat,这个map,那具体什么意思,给各位也是举这个具体的例子。假如我现在啊,这里边比如说我有这么三个元素啊,假如三个元素是我们的这么一个值,假如这个值比如说。
31:01
比如说啊,我第一个元素就是这个。ABC第二个元素,比如这个。WQ啊,随便写啊,然后第三个元素,比如这个什么at硅谷,大家看目前是不是有三个元素,而我现在比如说要做件事情,做什么事情了,比如说现在啊,我想把三个这个元素先变成流,就变成我的流的方式,用Fla map,那怎么变,你看现在这过程,比如说A硅谷进来,他把这个圆圈这个元素变成流。WQ进来变成流,ABC进来变成流,然后变成流之后我把这个值再进行输出,就是把这个at硅谷WQABC元素变成硫,然后把硫作成输出,比如他们输入之后就变成了at硅谷。WQ,然后ABC,这是一个大的一个流,就咱刚才提到的,我再说一遍啊,这过程很抽象,它就是把我们的每个元素先变成一个流,因为这里边有三个元素变成是不是有三个流,然后把三个流后变成一个大流,最终再进行返回,这个过程就是Fla map做的事情,而它这过程中用在什么地方呢?比如说我们在操作中,比如我现在返回查出就是一个对象,大家要返回,咱们符合我们的rewri,那个manner,或者说Fla的这种形式,那我给它变成流,然后再做进行返回,这个啊叫Fla map,各位把它先知道,咱一会儿用代码也会做一个具体实现。
32:34
这个啊是我们提到的第二运态符,也就是把你的多个元素先转成流,然后把你的多个流合并成一个大流,再进行输出,就是咱们看到这个现象,比如说现在at,硅谷WABC3个元素,咱变成三个流,把三个流合并成一个大流,再进行输出啊,当然这个流可能它没有这个,就是不一定有相应顺序,可能是第一个WQ,可能第一个ABC,或者第一个可能AV股啊,它里边没有严格的顺序的这种关系,主要把这个元素要变成流。
33:07
那我来写一下啊,它的做法就是把我们的每个元素先转成硫,然后他再把你转换之后的多个流合并成一个大的这么一个流,然后把这流最终做返回,这个过程就叫flat map,在操作中我们也经常用到,一会咱用代码会具体做一个实现。所以这个啊,是我们说到的关于这个RI里边的核心编程里边有这么几个基本内容。
我来说两句