什么是方法引用?
方法引用就是将复杂抽象函数的方法体简化。
上述匿名内部类可以利用方法引用简化成:
表示引用FunctionDemo1中的subtraction方法
方法引用的分类:
引用静态方法
现在这里有一个列表,里面存着一些字符串,要求将他们转换成Int类型。
常规方法:
常规方法就是调用map()方法,重写他的方法,方法体里写转换的代码,并将转换后的结果返回。
方法引用:
直接调用Interger类中中paseInt方法即可,这是Java本身存在的方法,或者我们自己写个静态方法,通过 “对象::静态方法”也可以实现。
引用成员方法
其他类
这里我们自定义了一个类,叫StringOperation,里面写了一个stringJudge方法。括号里通过new 一个新的对象来使用他的方法。或者创建对象写在外面也可以。如下:
本类
如上我们将stringJudge方法定义在同一个类中,括号里直接 this::方法名即可。但是要注意的是引用处不能是静态方法(这里的是在测试类中引用,测试类用static修饰了,所以报错)
父类
引用父类中的成员方法,引用处同样不能是静态方法
引用构造方法
现在我们有一个列表,要求将列表中的数据都封装成Student的对象
常规写法:
通过arr数组来存储姓名,name来获取姓名,通过变量age来获取年龄,在new一个student对象分别把姓名和年龄传过去。
我们可以把匿名内部类的方法体写在Student的其中一个构造方法里,注意这个构造方法的参数和返回值都要和抽象方法一致。不需要返回值。
然后我们回到测试类中,使用Student::new方法即可。
其他调用方法
使用类名去引用成员方法
要求将列表中的字符串里的字母改成大写,代码如下:
这里我们引用的是Java本身就有的方法,可以看到左边抽象方法中的参数是String s,但toUpperCase方法本身是没有参数的,我们要求引用的方法和抽象函数中的参数要一致,那这里为什么可以成功引用呢?
下面补充:
抽象方法中第一个参数表示可以引用哪些类中的方法,如上面只能引用String类中的方法。
第二个参数:如果没有,则说明被引用的方法本事就是无参的;
否则,从第二个参数起,每一个参数都要和引用方法的形参一致。
所以,与之前 “对象::成员方法” 不同,这种形式可以引用所有类中任何一个方法。只要你new他的对象。
而 “类名::成员方法” 只能引用第一个参数的类型的这个类中的方法,如上面只能引用String类中的方法。
引用数组的构造方法
其实就是创建了一个新的数组,并且把list中的数据放进数组里。