「编程」你真的完全弄懂了函数式编程么?( 二 )


②子类重写后的equals方法 。
父类引用指向子类引用 , 调用的是子类重写后的方法 。
该子类的父接口调用该方法 , 也是子类重写后的方法 , 但是子类其实重写的是Object(父类)中的方法 。
其中equals方法只是例子 , Object中的所有方法都适用 。
所以什么叫函数式接口?
有且仅有一个抽象方法的接口(需要被重写) , 进一步作出了补充 , 让自己对其的理解更加地完善 。
二、函数式编程回顾1.lambda表达式应用
①面向接口编程

方法参数有一个为接口 , 但是接口是没法实例化创建对象的 , 所以必然会有多态:需要传入该接口的实现类对象 。
为了简化代码 , 不想创建一个实现类 , 那么就可以直接使用匿名内部类或lambda表达式 。
②lambda表达式
方法中有两个参数 , 第一个为name , 第二个即为lambda表达式 。
lambda表达式本质上就是对应接口的实现类对象 , 该例子是作为方法参数 , 也可以作为方法返回值 。
如何更好地理解该表达式?
就可以将其理解成实现类重写方法中的参数和内容 , 也就是用什么参数 , 做了一件什么事情 。
所以写lambda表达式时 , 脑海里想着对应接口的实现类重写的方法就好了 。
2.Lambda的延迟执行

场景:一种典型的场景就是对参数进行有条件使用(日志案例)
①printLog方法:根据等级打印日志

方法有两个参数 , level和msg 。
一共有3个等级:

  • level为1时 , 表示情况最严重 , 我得打印日志 。
  • level为2时 , 表示情况警告 , 不用打印日志 。
  • level为3时 , 表示情况正常 , 也不用打印日志 。
②分等级打印日志
level有123三个等级 , 日志只有msg需要打印 。
那么现在问题来了:
当level为1时 , 自然没问题;
但是level为2时 , 为3时 , msg也被作为参数带入方法了 , 也就是说msg执行到了 , 但是实际上并没有用到它 , 从而造成性能浪费 。
那这个问题如何解决?就是使用lambda表达式:
①当level等于1时

这段代码就是函数式编程 。
多态:父类(接口)引用调用buildMsg方法 , 执行的就是子类(实现类)重写的方法 。
重写的方法是啥?
就是②中的lambda表达式 。
②当level等于2 , 等于3时
只有当level为1时 , buildMsg方法才被调用 , 重写的方法才会执行;
当level不等于1时 , 方法根本就没有执行 , 相比较一开始写的代码而言 , 更加地节约资源 。
所以综上所述:函数式编程有哪些好处?
  • 增加了代码拓展性 。
  • 某种情况下 , 更加地节约了资源 。
总结