Reactor 反应式编程介绍,框架中Mono、Flux 的使用(七)

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

上篇文章中,我们讲了Reactor 框架使用的第二个步骤:创建阶段的一个高级用法:怎么使用Reactor 进行并发操作。

本篇文章我们继续介绍另外一种处理阶段的高级用法。

处理阶段的高级使用方法

本文主要涉及的内容为:

  • Flux.fromIterable()
  • Flux.reduce()
  • BiFunction

在我们日常开发中,常常会遇到一个这样的场景:得到一个集合类对象(如List/Set/Map),然后对其中的元素进行处理。

我们的解决方案有很多,常见的迭代写法如下:

List<Object> list = xxx.getList();
for (int i = 0; i < list.size(); i++) {
    Object o = list.get(i);
    // 可以做相关的业务逻辑处理
}
复制代码

或者使用函数式编程:

List<Object> list = xxx.getList();
list.forEach(ele -> {
    // 做相关业务逻辑处理
});
复制代码

但是到了反应式编程中,就不是这样简单了。我们可以使用Fluxreduce()方法,其函数签名如下:

<A> Mono<A> reduce(A initial, BiFunction<A, ? super T, A> accumulator);
复制代码

从这个函数签名我们可以得到一个信息,reduce()方法就是把一个Flux聚合成一个Mono,然后返回。

这里对这个函数签名中的参数进行介绍:

  • 第一个参数:是返回值Mono中元素的初始值。
  • 第二个参数:是BiFunction类,其功能是用来实现聚合操作。

我们可以看到对于第二个参数BiFunction类,它后面有个泛型参数<A, ? super T, A>,这个泛型参数中的参数的意思为:

扫描二维码关注公众号,回复: 13690689 查看本文章
  • 第一个A表示每次聚合之后的结果的类型,它是BiFunction.apply()方法的第一个入参。
  • 第二个? super T 表示集合中的每个元素的类型,它作为BiFunction.apply()方法的第二个入参。
  • 第三个A表示聚合操作之后的结果,它作为BiFunction.apply()方法的返回值类型。

上述场景,我们现在改用反应式编程来实现:

Data initData = getInitData();
List<SubData> list = getSubDataList();
Flux.fromIterable(list)
    .reduce(initData, (data, itemInList) -> {
        // 对于data 和list 中的item 做相关的操作
        return data;
    });
复制代码

我们看到上述反应式编程的代码应该都比较难以理解,但是这个会随着我们的使用会变得更加熟练。

代码中的initDatadata的类型相同,执行完了上述代码之后,reduce()方法就会返回Mono<Data>

有的同学可能看到BiFunction不知道是什么,这个可以去学习一下Java 8 引入的函数式编程的用法,这里不再叙述。


本片文章主要讲解了Reactor框架的另一个在处理阶段的高级使用方法,处理阶段已经全部讲解完成。之后的文章会继续介绍使用Reactor框架的下一个阶段:结束阶段。

猜你喜欢

转载自juejin.im/post/7068634481380294687