「这是我参与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 -> {
// 做相关业务逻辑处理
});
复制代码
但是到了反应式编程中,就不是这样简单了。我们可以使用Flux
的reduce()
方法,其函数签名如下:
<A> Mono<A> reduce(A initial, BiFunction<A, ? super T, A> accumulator);
复制代码
从这个函数签名我们可以得到一个信息,reduce()
方法就是把一个Flux
聚合成一个Mono
,然后返回。
这里对这个函数签名中的参数进行介绍:
- 第一个参数:是返回值
Mono
中元素的初始值。 - 第二个参数:是
BiFunction
类,其功能是用来实现聚合操作。
我们可以看到对于第二个参数BiFunction
类,它后面有个泛型参数<A, ? super T, A>
,这个泛型参数中的参数的意思为:
- 第一个
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;
});
复制代码
我们看到上述反应式编程的代码应该都比较难以理解,但是这个会随着我们的使用会变得更加熟练。
代码中的initData
和data
的类型相同,执行完了上述代码之后,reduce()
方法就会返回Mono<Data>
。
有的同学可能看到BiFunction
不知道是什么,这个可以去学习一下Java 8 引入的函数式编程的用法,这里不再叙述。
本片文章主要讲解了Reactor
框架的另一个在处理阶段的高级使用方法,处理阶段已经全部讲解完成。之后的文章会继续介绍使用Reactor
框架的下一个阶段:结束阶段。