引子
还记得上次分享的练习题 有一箱东港九九草莓,想吃其中最大的一颗草莓?(可模拟所需的所有数据)
自己实现筛选工具类
其中Comparator不是系统的类,是我自己实现的接口
Comparator类代码:
使用lambda如何实现
通过方法引用如何实现
在使用方法引用时,取方法名要格外恰当,好的方法名能让代码像是在描述问题而不是在解决问题
现在我不想吃最大的草莓了,我想吃最甜的草莓,要怎么做呢?
高阶函数:如果一个函数的输入或者输出也是函数,那么这个函数就是高阶函数。举个例子
如果最大的草莓重量相同时,我想吃其中最甜的,怎么做?
java8的接口允许定义静态方法,要定义实例方法,需要关键词default,即为默认方法
如果要在其他类里再次筛选,代码就要重复,因此,考虑把逻辑封装到接口里,代码如下:
有没有办法像链式调用那样,在外层添加新的判断逻辑呢?
可以的,Comparator接口里,实现thenCompare方法。
复合Lambda表达式
这里我们自己实现了一个Lambda表达式的复合使用。把多个简单的Lambda复合成复杂的表达式
lambda重构
Lambda与匿名内部类的差异
匿名类中this代表的是函数式接口对象,但是在Lambda表达式中代表的是外部所在的类。
lambda表达式里的局部变量不能和外部的变量重名,匿名内部类可以
匿名内部类可以实现非函数式接口,lambda表达式只能作为是函数式接口的传入
lambda表达式的类型问题
lambda表达式反映的是结构
lambda实战应用
表达式解决设计模式与生俱来的设计僵化问题
lamdba表达式与设计模式
对策略方法,观察者模式时,把设计模式里涉及到函数式接口替换成lambda表达式表示即可。
模板设计模式
模板设计模式,通过继承抽象类,实现抽象方法来实现。这时候可以直接引入一个新的参数,来替换抽象类,函数描述符。
责任链模式
而责任链模式使用了复合lambda表达式
把数据结构里的链式思维应用在面向对象的编程里,将每一个链条的节点看作是一个对象,每个对象拥有不同的处理逻辑。一个业务逻辑被看作从链条的首端发出,途径一个个链节点,至末端结束。
面向对象的编程:
使用父类&子类建立思维体系
通过类与类的相互联系和通信来组织逻辑
用重写来表达变化
用抽象方法表达抽象
用接口来表达抽象
链节点:作为对象,我们建立一个基类来表示,具体的每个节点是它的子类。
每个对象/节点处理不同的逻辑:不同是变化,需要抽象出来,可以用抽象方法表达抽象,也可以用接口表达抽象。这里我们用抽象方法来做
链式思维:每个当前节点,持有下一个节点,如果是双向的链式,则再持有上一个节点。常用的方式,当前节点的输出作为下一个节点的输入
代码实现
FirstNode
SecondNode
使用
简单工厂
工厂设计模式,使用到构造函数的方法引用
Java8的lambda表达式与Kotlin,Python的差异
这些设计模式在使用lambda表达式重写会更简洁,但是也有人疑问,lambda只是让代码简洁而已,我用匿名内部类或接口仍然可以健壮的实现功能啊。对于这个疑问,我的理解是,如果赞同函数式编程是未来的方向,那么就很有必要使用lambda表达式,lambda表达式这套新的符号背后承载的是不同以往的思维方式--即所谓的“函数式”的思维。不够好的式Java8的lambda是不完全的函数式,但是从另一个角度来说,这也是好的,java8不完全的函数式能让java 7的程序员更容易和平稳得从面向对象过渡到函数式编程。
函数式的程度由低到高是:
Java8 《 Kotlin 《 Python
我分别举个Koltin和Python的例子
Kotlin实现链式
Kotlin比Java8更加函数式
Python实现链式
Python比Kotlin更加函数式
领取专属 10元无门槛券
私享最新 技术干货