方法引用

/*
需求:
    1.定义一个接口(Printable):里面定义一个抽象方法:void printString(String s);
    2.定义一个测试类(PrintableDemo),在测试类中提供两个方法
        一个方法是:userPrintable(Printable p)
        一个方法是主方法,在主方法中调用usePrintable方法
*/

interface Printable{
    void printString(String s);
}

public class PrintableDemo{
    public static void main(String[] args) {
        //在主方法中调用usePrintable方法
        //Lambda
        userPrintable(s -> System.out.println(s));
        //方法引用符::
        userPrintable(System.out::println);

        //可推导的就是可省略的
    }

    private static void userPrintable(Printable p){
        p.printString("Java!!!");
    }
}

  1. 方法引用符
  • ::该符号为方法引用运算符,他所在的表达式被称为方法引用
  1. 上例解释

Lambda表达式:

userPrintables(s->System.out.println(s))
拿到参数s后通过Lambda表达式传递给System.out.println()方法处理

方法引用:

usePrintable(System.out::println);
直接使用System.out中的println方法来取代Lambda代码更加的简洁

方法引用相当于Lambda的孪生兄弟

Lambda表达式支持的方法引用

引用类方法,即引用类的静态方法

  • 格式: 类::静态方法
  • 例如: Integer::parseInt
  • Integer类的方法:public static int parseInt​(String s) 将此String转换为int类型数据

引用对象的实例方法,即引用类中的成员方法

  • 格式:对象::成员方法
  • 例如: "HelloWorld"::toUpperCase
  • String类中的方法:public String toUpperCase​() 将此String所有字符转换为大写

引用类的实例方法,即引用类中的成员方法

  • 格式:类名::成员方法
  • 例如: String::substring
  • String类中的方法: public String substring​(int beginIndex,int endIndex)
  • 从beginIndex开始到endIndex结束,截取字符串。返回一个子串,子串的长度为endIndex-beginIndex

引用构造器,即引用构造方法

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