首页
Preview

[Reactor Java #2] 如何操作 Mono 和 Flux 中的数据?

在本文中,我将展示如何修改和转换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的前几个元素。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论