响应式编程的一些其他操作

前面几节介绍了一些常用的功能,本节会介绍一些常用操作(Operations),其实和jdk8的stream还是挺不一样的。

reactor3包含了很多操作相关的api,所以真的很建议大家还是要去看一下javadoc文档。不过在开发的时候,如果下载源码的话,也可以根据sdk的doc来看看哪个方法可以解决你当下的问题。

zip

zip的功能主要用于组装一些flux为一个,实际使用中,可以简单的合并为Tuple,这个结构有经验的应该看到就知道怎么回事了,他就是一个简单的结构体,包含若干个内容,在reactor3中,有Tuple2~Tuple8,也就包含两个参数到包含8个参数的结构体。

先举个基础数据的例子,代码如下:

我们简单的使用结构体的方式来合并这两个flux,代码如下:

这里吧first和last合并成为了一个Tuple,因为有两个元素,所以合并成了Tuple2,两个元素分别也就是t1和t2。所以不管最后是Tuple几,包含的元素就是t1到t几。

下面看个合成对象的例子:

可以看到,第一个参数是个Function,后面的参数是个Publisher列表,我们针对数据列表以及User的一个构造方法,把两个flux合并成为了一个User的Flux。

使用具体对象和Tuple的区别也是非常显而易见的,如果我们的数据是个临时的,那么为了省事我们可以直接使用Tuple来暂存合并处理;但是Tuple语义不明,如果我们要想写的更清晰,那么就使用对象会有更好的表达。

first&firstWithSignal&firstWithValue

first现在其实和firstWithSignal是一个意思,并且目前推荐使用firstWithSignal,first已经被启用了(底层也是调用的firstWithSignal)。

先看代码再说吧:

其接收Publisher参数列表,Mono和Flux都有该方法(Flux的区别不大,这里就不赘述了),意义是接收到第一个信号的时候返回,这里的信号特别解释一下,之前我们打印过log,能够知道整个流程会有多个事件,比如onNext事件、onError事件等,这里的信号是说,所有的这些事件都会被认为是找到第一个了。比如我们先获取到了数据会得到,又或者是我们获得了一个onError事件,也会得到结果,总之就是获得第一个获得的事件结果。

那么还有个firstWithValue,这个方法名一看就很明确,我们要得到的是一个值,所以当你返回事件我是忽略的,我只想获取第一个得到的值,如果所有的Publisher都没有给到值,那么还会产生一个NoSuchElementException的异常。

ignoreElements&then

这两个方法在部分时候也是有用的,ignoreElements这个方法通过名字很清晰,就是忽略掉所有的元素,一个Publisher忽略掉所有的元素之后还剩什么呢,自然就是各种事件了,那么既然只剩时间了,我们也不需要Publisher再返回什么了,我们只需要调用then,就可以让Publisher最后返回一个Mono<Void>。具体的可以看下代码示例:

这里有两个需要注意的,doOnComplete要紧跟flux,另外一个就是subscribe一定要调用,不然整个Publisher不会进行(这个也是之前说过的)。这里我们只是在得到执行结果之后进行了打印,实际开发中,可以再完成后执行一些可能的逻辑。

justOrEmpty&switchIfEmpty

正常情况下,我们Mono是不需要传入null值的(Flux没有问题,也只有just方法,所以如果是Flux就请不用担心),我们最常用的just方法的参数如果有null的话,会报空指针的,那如果我们不确定传入的参数是不是null怎么办,为了避免报错我们可以使用justOrEmpty方法。另外如果真的是空值的话,我们想替换成默认值(比如我们从第三方系统加载配置,但是配置没有我们要加载本地默认配置),可以使用switchIfEmpty方法来设置如果为空的话我们设置为什么内容。具体示例可以看下面的一个简单的代码示例:

这里为了简单,我直接声明了一个为null的str,这里会打印hello。

collectList

如果我们相对Flux的数据聚合到一起去一起处理,我们可以使用collectList,将Flux<T>变换成为Mono<List<T>>。试下如下代码示例:

这样便于我们对列表数据一起处理,当然实际上reactor3还包括了一系列的collect方法,比如collectSortedList、collect(自定义方法)、collectMap等,大家可以自己看看javadoc自己尝试一下。

至此,针对一些常用的操作就介绍完了,其实还有一些是没有介绍到的,当你想到你想用的功能的时候,可以直接去看下javadoc就知道有没有满足自己需求的了,不过现在,也非常推荐大家自己下载一个示例来试试或者看看reactor3为我们提供的操作方法列表以及用处。

©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: 响应式编程的一些其他操作

发表评论

电子邮件地址不会被公开。 必填项已用*标注