Java编程方法论:响应式Spring Reactor 3设计与实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 Mono的二三事

一个Flux代表一连串指定类型的事件,而且Flux中有很多方便的静态方法,可以用于创建各种我们需要的源的实例。通常,你会碰到只有0个或1个元素的源序列。举个例子,当根据用户的id查找用户的时候,其返回结果要么为空,要么是一位用户。在Reactor中,可以使用Mono来处理这一情况。Mono对源进行创建的方式与之前介绍的Flux比较相似,可以类比RxJava中的Flowable和Single,Single用于处理单值源序列,与Mono很相似。在RxJava中,可以使用Completable来专门应对空序列或者只关注源下发结束的状况。假如这都觉得麻烦的话,那么直接选用Maybe吧,其属于Single和Completable两者的结合体,可以发射0个、1个或错误的事件。Mono类中也包含了just、empty、error和never等一些与Flux类中相同的静态方法。除此之外,Mono中还有一些独有的针对自己特性的静态方法,分别介绍如下。

◎ fromCallable、fromCompletionStage、fromFuture、fromRunnable和fromSupplier方法:分别从Callable、CompletionStage、CompletableFuture、Runnable和Supplier中创建Mono对象。

◎ delay(Duration duration)方法:创建一个Mono源序列,在指定的延迟时间之后,产生数字0作为唯一元素下发,然后调用actual.onComplete。

◎ ignoreElements(Publisher<T> source)方法:创建一个Mono源序列,忽略作为源的Publisher中的所有元素,只产生结束消息(其内部onNext方法的下发操作为空实现,代表忽略)。

◎ justOrEmpty(Optional<?extends T> data)和justOrEmpty(T data)方法:从一个Optional对象或可能为null的对象中创建Mono。只有Optional对象中包含的值或对象不为null时,Mono源序列才产生对应的元素。

同样,可以通过create方法来使用MonoSink创建Mono。

在这里,就不对其源码进行深入分析了,感兴趣的读者可以自行查阅源码,下面只给大家准备一个Demo展示一下:

接下来,会介绍一些比较实用的内容,可方便读者在项目中根据具体情况使用。