首页 Reactor系列 - 函数式编程
文章
取消

Reactor系列 - 函数式编程

什么是函数式编程?

要给一个东西下定义, 必须要将一个东西的特点具象化。比如像别人介绍一个东西。张三向李四介绍另一个李四不认识的人王五,如果张三跟李四说那个人叫王五,你见过的,那李四肯定不认识。那现实中你向别人介绍的时候是怎么介绍的呢,“那个脸上有很多大麻子,眼睛上面还有一条刀疤的人就是王五”,那王五的特征就有了大麻子,眼睛有刀疤。

那现在要认识函数式编程,那有什么特点的编程方式才能叫自己函数式编程呢?

  1. 函数是”一等公民”

    什么是一等公民?就是编程中既可以作为函数调用的入参也能作为函数调用的返回的就是“一等公民”,例如基础的数据类型,那java中的一等公民是没有函数的,但是java中以函数类(functional Interface)实现函数是一等公民的补充。一个函数类就是代表一个函数。

  2. 只使用”表达式”,不使用”语句”

    表达式是一个单纯的运算过程,总是有运算结果的, 而语句则只是执行一个操作,不一定需要返回,函数式编程从一开始就是为了运算(一开始在学术上运用的最多,最简单的数学中的 f(x) 就是函数式编程的一个代表)

  3. 没有副作用

    这里的副作用指的是不修改全局变量,不产生除了运算结果以外的结果。

  4. 不改变状态

    命令式编程一般变量保存在对象中,但是函数式编程的另一个重要的特点是不修改系统变量, 也就是上面说的不产生运算以外的结果。变量通过参数进行传递。

  5. 引用透明

    与前面的两点的意思一样,便与观察与理解程序的意思。

​ 到这里什么是函数式编程的定义就已经明了了, 但是在实际的实现中的时候,前面的两点:函数可以作为入参也可以作为出参,并且函数式编程肯定会有返回,一般具备,但是后面的三点不是强规范。

java中的函数式编程

​ java编程中的一等公民有基础数据类型,类。方法默认在java中并不是一等公民,但是在java8中,java通过曲线救国的方式实现了对函数式编程的支持。以一个特殊的 “接口类” 代表一个函数。最具代表性的就是Function函数

使用场景

当你想使用一个函数,但是又不想重新定义一个类的时候,就可以通过使用这些函数式编程接口的方式进行实现。

具体类型

java.util.function.Function<T, R>

这个接口类就代表一个函数,T是这个函数的入参,R是这个函数的出参。所有的使用这个接口实现的都可以通过转换成普通的函数调用。

下面通过一个最简单的例子描述两种编程方式的区别。

函数式编程

1
2
//调用方式:toString.apply(4);
Function<Integer, String> toString = i -> String.valueOf(i);

命令式编程

1
2
3
4
5
6
7
8
//调用方式new Convert().toString(4);
public class Convert{
  
  public String toString(int i){
    return String.valueOf(i);
  }
}

参考:

函数式编程初探

本文由作者按照 CC BY 4.0 进行授权

Reactor系列- Reactive Stream api规范初识

泛型与bridge方法