方法引用:在使用Lambda表达式中,我们实际上传递进去的代码就是一中解决方案,拿什么参数做什么操作,那么考虑一种情况,如果我们在Lambda所制定的操作方案,已经存在,我们没必要再写重复逻辑。
方法引用常用用法:
1、通过对象名引用成员方法:
练习:
1、接口
package Demo02.methodReference;
@FunctionalInterface
public interface Printable {
void print(String str);//打印字符串的抽象方法
}
类:
package Demo02.methodReference;
public class MethodReferenceObject {
public void printUppercaseString(String s){
System.out.println(s.toUpperCase());
}
}
测试:
package Demo02.methodReference;
import java.lang.reflect.Method;
/*
通过对象名引用成员方法
使用前提:对象名已经存在,成员方法已经存在,就可以使用对象名来引用成员方法。
*/
public class Demo01MethodReference {
public static void printString(Printable p){
p.print("yaoyao");
}
public static void main(String[] args) {
//三种输出效果相同。
//printString(new MethodReferenceObject()::printUppercaseString);
//printString(s-> System.out.println(s.toUpperCase()));
//使用lambda表达式,表达式里创建MethodReferenceObject
//接着调用对象里面的方法完成Lambda表达式的要求。
printString((s)->{
MethodReferenceObject obj = new MethodReferenceObject();
obj.printUppercaseString(s);
});
}
}
2、通过类名称引用静态方法:
package Demo02.methodReference;
public class Demo02StaticMethodRe {
public static int method(int number,Calcable c){
return c.calsAbs(number);
}
public static void main(String[] args) {
int num = method(-10,n->Math.abs(n));
System.out.println(num);
/*num =method(-20,Math::abs);
System.out.println(num);*/
System.out.println(method(-1998,StaticMethodRe::method));
}
}
3、通过super引用父类的成员方法:
package Demo02.Test1;
public class Man extends Human{
@Override
public void say(){
System.out.println("Hello,我是子类");
}
public void method(Greetable g){
g.great();
}
public void show(){
/*method(()->{
Human human = new Human();
human.say();
});*/
method(super::say);//通过super引用成员方法
}
public static void main(String[] args) {
new Man().show();
}
}
4、通过This引用成员方法:
package Demo02.Test1;
public class Man extends Human{
@Override
public void say(){
System.out.println("Hello,我是子类");
}
public void method(Greetable g){
g.great();
}
public void show(){
/*method(()->{
Human human = new Human();
human.say();
});*/
method(super::say);
}
public static void main(String[] args) {
new Man().show();
}
}
5、类的构造器的引用
package Demo02.Test3;
//类的构造器的引用
public class Demo {
public static void printName(String name,PersonBuilder pb){
Person person = pb.builderPerson(name);
System.out.println(person.getName());
}
public static void main(String[] args) {
printName("yaoyao",Person::new);
}
}
5、数组的构造器的引用