在本文中,我将展示如何修改和转换Mono和Flux中的值。我们将通过示例完成此操作。
在Flux或Mono上应用数学运算
假设计算1到100区间内每个整数值的平方。要使用Flux执行此操作,首先必须创建一个包含从1到100的所有整数值的Flux,使用Flux.range(1, 100)
。
那么,如何计算每个值的平方?
Mono和Flux提供了一个名为map
的方法,其接口为Flux<B> map(Function<A, B> mapper)
。这意味着将将转换类型为A到类型B的元素的函数传递给map方法,你的Flux<A>
将将此函数应用于Flux中的每个元素,这将导致将你的Flux<A>
转换为Flux<B>
。请注意,B可能与A具有相同的类型。使用此方法,我们可以在Flux上应用平方函数。让我演示一下:
Mono也是如此。
在Flux和Mono上应用多个转换
现在,让我们看一个链接多个map调用的示例。
flatMap方法
flatMap方法与map方法类似,关键区别在于你提供给它的供应商应返回Mono<T>
或Flux<T>
。使用map方法会导致Mono<Mono<T>>
,而使用flatMap会导致Mono<T>
。
例如,当你必须进行网络调用以检索数据时,使用Java API返回Mono,然后进行另一个需要第一个调用结果的网络调用时,它非常有用。
此外,它允许精确处理错误。让我通过下面的另一个示例进行演示。
zip方法
让我们通过示例了解此方法。想象一下,你想编写一个方法,该方法检索用户的信息以及她在你的网站上编写的所有评论。
使用flatMap,你将编写:
上述代码的问题在于,它将在程序接收到userInfo之后进行获取用户评论的调用。对于用户体验来说一点也不好。
zip方法允许轻松组合多个Mono
的结果,这样做的好处是你的zip方法的执行时间将与最长的Mono
一样长,而不是所有执行的总和。
因此,现在可以使用以下代码完成与上面相同的操作:
过滤Flux或Mono的元素
你还可以使用filter
方法在持有Flux或Mono的元素上应用过滤器。
选择Flux的子集
在使用Flux时,你可以选择Flux的子集。该类提供了7种方法来选择最适合你需求的子集。这些方法是:
public Flux<T> take(long n)
public Flux<T> take(Duration timespan)
public Flux<T> take(Duration timespan, Scheduler timer)
public Flux<T> takeLast(int n)
public Flux<T> takeUntil(Predicate<? super T> predicate)
public Flux<T> takeUntilOther(Publisher<?> other)
public Flux<T> takeWhile(Predicate<? super T> continuePredicate)
默认情况下,take
方法获取Flux的前几个元素。
评论(0)