为了更清楚的理解为什么需要函数方法和Lambad,我们一步一步的以实际的场景案例来进行分析;
1.我们有很多钱,但是钱的面额有10,50,100,我们为了统计100元的有多少,我们的做法如下:
创建一个A类,A类有一个A'方法,该方法可以统计出100元的个数;
即该类将功能(筛选百元钞票的个数)进行了内嵌,如果需要则只需要创建该实例,调用该方法即可。
2.但当我们还需要筛选出特定要求的百元钞票的编号时,我们的做法如下:
1)基于A类,在A'方法上,进行一定的修改和扩充,实现筛选编号;
2)基于A类,写一个A''方法,实现钞票的筛选;
上面两个方法都只能解决少量的功能的实现,但是当需求增多时,则需会出现一个庞大的方法或者庞大的类;
同时为了遵循设计模式的基本原则:单一原则,一个类或者一个方法,尽可能的只负责一个功能;
我们的做法是:
使用一个B类,该类有一个功能,来实现统计百元钞票的个数,在使用该功能时,我们有以下做法:
1)我们常见创建一个B类实例,只需要将该对象传递给A类,作为A类某个方法的参数,然后在方法中调用B类的方法即可。(注意我们一般是创建一个接口,接口中有方法,然后创建需要的实现类)
3.当功能发生变动时,我们可以做如下改动:
1)在B类的基础上,对原有的方法进行修改;
2)在B类的基础上,创建一个新的方法;
2)创建一个新的类,实现新的功能;
4.当功能频繁变动,上面的方法的弊端就是需要修改或扩充类的方法,从而生成一个庞大的类,或者不停的创建一个新的类,但是对于这两种选择,我们选择横向扩展,即创建多个实现了单一功能的类,这样模块可以尽可能的小,但当进行调用的使用,我们又面临一个问题,即频繁的实例化类,对于不同的功能,我们需要显示的实例化不同的类,我们可以这样做:
1)使用匿名类,需要哪个类,当如果需要新的功能,直接在匿名类中写逻辑代码,但是会造成类的冗余
因此这个时候,Java8新的特性,思想是行为参数化,将一个行为作为参数传递给方法,从而应对频繁的需求改动:
注意:lambda行为参数化,只需要一个函数式接口(只有一个方法的接口),然后再调用的地方,可以直接写Lambda表达式,表达式可以实现同类功能的任意编写,即相同的返回值,只要返回值是接口定义方法的返回值,对于内部的逻辑实现,则可以自由编写,这样就不需要因为需求的变动而增加额外的类。可以将Lambda表达式,看做是函数式接口的实现。
5.当我们使用lambda时,我们通过表达式,有时候很难想起来该表达式实现了什么功能,为了更方便的识别方法的功能,Java8引入了方法引用:
方法引用可以看做是调用特定方法的一种快捷方式,它根据已有的方法创建Lambda表达式。
( Java8新特性:在接口中可以定义默认方法和声明静态方法,并且可以实现。)
这是本人对Lambda表达式和方法引用的一些理解。
如有问题,敬请指出,谢谢观看,与君共勉。