方法引用详解

方法引用详解

方法引用对标于Lambda代码块,我们可以通过两者对比来学习方法引用

方法引用初体验

在学习Lambda时,我们创建接口,并直接采用Lambda代码块来代替书写继承类直接执行编译

下面给出代码示例:

public class Demo {
    public static void main(String[] args) {
        //我们先回顾lambda方法
        useInter((String s) -> {
            System.out.println(s);
        });

        useInter(s -> System.out.println(s));

        //然后我们在lambda基础上采用方法引用符::
        useInter(System.out::println);
    }

    public static void useInter(Inter inter){
        inter.run("接口");
    }
}
public interface Inter {
    void run(String s);
}

方法引用符

方法引用符:

  • ::该符号为引用运算符,而它所在的表达式被称为方法引用

回顾对比一下我们体验方法引用的代码:

  • Lambda代码块:useInter(s -> System.out.println(s));
  • 方法引用:useInter(System.out::println);

我们可以看到我们直接使用System.out中的println,省略掉了参数的书写以及参数的带入,而是直接使用方法

推导和省略:

  • 如果使用Lambda,那么根据“可推导就是可省略”原则,无需指定参数类型,无需指定重载形式,他们都将被自动推导
  • 如果使用方法引用,那么同样可以实现自动推导
  • 方法引用时Lambda的孪生兄弟

方法引用四种方法

方法引用可以分为四种情况:

  • 引用类方法
  • 引用对象的实例方法
  • 引用类的实例方法
  • 引用构造器

下面我们将一一讲解

引用类方法

引用类方法,实质上是引用类的静态方法

  • 格式:类名::静态方法
  • 范例:Integer::parseInt

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //老规矩,我们先给出lambda方法
        useInter((String s) -> {
            return Integer.parseInt(s);
        });

        useInter(s -> Integer.parseInt(s));

        //然后我们给出引用类方法: 类::方法
        //(这里的参数全部放入类方法的参数)
        useInter(Integer::parseInt);
    }

    public static void useInter(Inter inter){
        int i = inter.toInt("666");
        System.out.println(i);
    }
}
public interface Inter {
    int toInt(String s);
}

引用对象的实例方法

引用对象的实例方法,实质上是引用类的成员方法

  • 格式:对象::成员方法
  • 范例:“HelloWorld”::toUpperCase

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //首先给出Lambda方法
        useInter(s -> System.out.println(s.toUpperCase()));

        //然后我们采用引用对象的方法
        //(这里的参数全部放入类成员方法的参数)
        InterImpl i = new InterImpl();
        useInter(i::printUpper);
    }

    public static void useInter(Inter inter){
        inter.printUpper("HelloWorld");
    }
}
public class InterImpl {
    public void printUpper(String s){
        System.out.println(s.toUpperCase());
    }
}
public interface Inter {
    void printUpper(String s);
}

引用类的实例方法

引用类的实例方法,实质上是引用类中的成员方法(注意:这里的成员方法是有对象的)

  • 格式:类名::成员方法
  • 范例:String::subString

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //lambda方法
        useInter((String s,int x,int y) -> {
            return s.substring(x,y);
        });

        //转化为类的实例方法
        //(第一个参数作为类的实例对象,后面参数作为参数带入)
        useInter(String::substring);
    }

    public static void useInter(Inter inter){
        System.out.println(inter.mySubString("HelloWorld",3,5));
    }
}
public interface Inter {
    String mySubString(String s,int x,int y);
}

引用构造器

引用构造器,本质上是引用构造方法

  • 格式:类名::new
  • 范例:Student::new

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //lambda:
        createStudent((String name,int age) ->{
            return new Student(name,age);
        });

        createStudent((String name,int age) -> new Student(name,age));

        //引用构造器:(所有参数均带入类的构造参数)
        createStudent(Student::new);
    }

    //提供方法构造Student
    public static void createStudent(StudentBuilder sb){
        Student student = sb.build("孙策",18);
        System.out.println(student.name + student.age);
    }
}
public class Student {
    String name;
    int age;

    Student(){

    }

    Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public interface StudentBuilder {
    Student build(String name,int age);
}

结束语

好的,关于方法引用的话题就到这儿了

posted @ 2022-07-06 15:30  秋落雨微凉  阅读(209)  评论(0编辑  收藏  举报