本系列其他文章见:《响应式Spring的道法术器》。
前情提要:响应式编程 | 响应式流
1.3 Hello,reactive world
前面两篇文章介绍了响应式编程和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的“手感”吧。

这一节,我们先了解一下lambda与函数式(已经了解的朋友可以直接跳到1.3.2),熟悉一下如何使用Reactor进行响应式编程,然后使用Spring Boot2,基于Spring 5的Webflux和Reactive Spring Data逐步开发一个“Hello world”级别的RESTful service。
1.3.1 lambda与函数式
在响应式编程中,lambda与函数式的出镜率相当高,以至于网上经常有朋友直接用“函数响应式编程”用在“响应式编程”的介绍中。这两个词的异同一直存在争议,其区别虽然不像“JavaScript与Java”、“雷锋塔与雷峰”那么大,但随便混用还是会显得非常不专业:
- 函数响应式编程的重点在于“函数式”的语言特性,这个概念在二十年前就盖棺定论了。
- 响应式编程的重点在于“基于事件流”的异步编程范式,由不断产生的数据/时间来推动逻辑的执行。
本系列文章讨论的都是“响应式编程”,关于“函数响应式编程”,你就当没听过,并谨慎地使用它就好了。
1.3.1.1 lambda表达式
书回正传,为什么响应式编程中会经常用到lambda与函数式呢?不知你对1.1.3节的一段伪代码是否还有印象:
cartEventStream
// 分别计算商品金额
.map(cartEvent -> cartEvent.getProduct().getPrice() * cartEvent.getQuantity())
...
cartEventStream
是一个数据流,其中的元素就是一个一个的cartEvent
,map
方法能够对cartEvent
进行“转换/映射”,这里我们将其转换为double
类型的金额。
除了转换/映射(map)外,还有过滤(filter)、提供(supply)、消费(consume)等等针对流中元素的操作逻辑/策略,而逻辑/策略通常用方法来定义。
在Java 8之前,这就有些麻烦了。我们知道,Java是面向对象的编程语言,