Java中的函数式编程

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

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

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

二、纯函数的闭包特性

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

纯函数的优点:

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

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

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

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

  • Function接口:典型的函数式接口,内部只有一个apply()接口方法,含义为接受一个对象,经过函数处理后,返回另一个类型的对象
  • Runnable接口:内部只有一个无返回值的run() 方法
  • Callable接口:内部只有一个有返回值的call() 方法,含义为执行并返回一个结果
  • Comparable:内部只有compareTo(T o)方法。含义为与传入的对象比较并返回一个结果

其它的还有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值