Java中的函数式编程

一、函数式编程与面向对象编程的区别

从宏观的角度说,面向对象编程思想是抽象出一个个对象,使用这些对象互相协作来达成目的。而函数式编程是定义一种处理规则,就像数学里面定义的函数,我接收一个输入,并针对相同的输入产生一个固定的输出。函数式编程就是使用这些独立的函数来组合达成目的。

从具体的角度说,函数式编程中可以将一个函数像变量一样定义或传递,可以在方法中接收一个函数作为参数,或者说接收一种处理规则,然后在方法中就可以使用这个函数来接收输入并产生输出。

二、纯函数的闭包特性

  1. 对相同的输入始终返回相同的值
  2. 自包含函数内部不需要依赖函数范围外部的数据,只接收输入参数,然后进行处理产生输出
  3. 函数执行过程中不会改变外部的数据或者状态

纯函数的优点:

  • 纯函数不那么复杂
  • 更容易调试
  • 易于组合
  • 易于并行化,因为它不需要依赖也不会改变外部的状态,所以在并行的时候不会相互影响。例如在分布式并行计算框架spark中就是利用了scala的闭包特性,可以很好的支持并行化处理数据。

参考:https://zhuanlan.zhihu.com/p/139659155

三、Java8中的函数式编程:函数式接口与lambda表达式语法糖

接口中只有一个抽象方法的就是函数式接口,例如常用的

  • Runnable接口:内部只有一个无返回值的run() 方法
  • Callable接口:内部只有一个有返回值的call() 方法,含义为执行并返回一个结果
  • Comparable:内部只有compareTo(T o)方法。含义为与传入的对象比较并返回一个结果

其它的还有Function、Consumer等。

当需要传入一个函数式接口实现对象时,只需要传入一个代表对应方法的lambda表达式即可,基本格式如下

(函数参数列表) -> {函数体}

lambda表达式是Java8中引入的一个语法糖,其底层并不是创建一个匿名内部类,而是通过invokedynamic 字节码指令实现的,因此性能更好。优点:

  • 编写方便,可读性好
  • 相比于匿名内部类性能更好

参考:
https://blog.csdn.net/weixin_43415201/article/details/109957738
https://zhuanlan.zhihu.com/p/426903943
https://www.cnblogs.com/510602159-Yano/p/15164980.html
https://www.infoq.cn/article/java-8-lambdas-a-peek-under-the-hood

你可能感兴趣的:(Java工程师,java,开发语言)