方法引用

1、方法引用符

:: 該符號為引用運算符,而它所在的表達式被稱為方法引用

推導與省略

  • 如果使用 Lambda,那麼根據「可推導就是可省略」的原則,無需指定參數類型,也無需指定的重載形式,它們都將被自動推導

  • 如果使用方法引用,也是同樣可以根據上下文進行推導

  • 方法引用是 Lambda 的孿生兄弟

2、引用類方法

引用類方法,其實就是引用類的靜態方法

格式:類名::方法名
範例:Integer :: parseInt

註:Lambda 表達式被類方法替代時,它的形參全部傳遞給靜態方法作為參數

代碼示例:將 String 類型數字轉為 int 類型數字

public interface StringConvert {
    int convertInt(String s);
}
public class Test {
    public static void main(String[] args) {
        // lambda方式
        usrStringConvert(s -> Integer.parseInt(s));

        // 方法引用:引用類方法(靜態方法),形參全部傳遞給靜態方法作為參數
        usrStringConvert(Integer::parseInt);
    }

    public static void usrStringConvert(StringConvert sc) {
        int num = sc.convertInt("156");
        System.out.println("num  = " + num);
    }
}	
num = 156
num = 156

3、引用構造器

引用構造器,其實就是引用構造方法

格式:類名 :: new
範例:Student :: new

註:Lambda 表達式被構造器替代時,它的形參全部傳遞給構造器作為參數

代碼示例:創建學生

public class Student {
    String name;
    int age;
    
    // 省略無參|有參構造方法、get|set方法、toString方法
}
public interface StudentBuilder {
    Student builder(String name, int age);
}
public class Test {
    public static void main(String[] args) {
        // lambda方式
        usrStudentBuilder((name, age) -> new Student(name, age));

        // 方法引用:引用構造器(構造方法),形參全部傳遞給構造器作為參數
        usrStudentBuilder(Student::new);
    }

    public static void usrStudentBuilder(StudentBuilder sb) {
        Student student = sb.builder("張三", 23);
        System.out.println("student = " + student);
    }
}
student = Student{name='張三', age=23}
student = Student{name='張三', age=23}

4、引用類的實例方法

引用類的實例方法,其實就是引用類中的成員方法

格式:類名 :: 成員方法
範例:String :: substring

註:Lambda 表達式被類的實例方法替代時,第一個參數作為方法調用者,後面其餘參數全部傳遞給該方法作為參數

代碼示例:截取字符串,返回一個子串

public interface StringMethod {
    String mySubString(String string, int begin, int end);
}
public class Test {
    public static void main(String[] args) {
        // lambda方式
        usrStringMethod((string, begin, end) -> string.substring(begin, end));

        // 方法引用:引用類的實例方法(成員方法),第一個參數作為方法調用者,後面其餘參數全部傳遞給該方法作為參數
        usrStringMethod(String::substring);
    }

    public static void usrStringMethod(StringMethod sm) {
        String string = sm.mySubString("HelloWord!", 3, 6);
        System.out.println("string = " + string);
    }
}
string = loW
string = loW

5、引用對象的實例方法

引用對象的實例方法,其實就引用類中的成員方法

格式:對象::成員方法
範例:”HelloWorld” :: toUpperCase

註:Lambda 表達式被對象的實例方法替代時,它的形參全部傳遞給該方法作為參數

代碼示例

public interface Printer {
    void printUpper(String s);
}
public class PrintString {
    void printUpperCase(String s) {
        String string = s.toUpperCase();
        System.out.println("string = " + string);
    }
}
public class Test {
    public static void main(String[] args) {
        // lambda方式
        usrPrinter(s -> System.out.println(s.toUpperCase()));

        // 方法引用:引用類對象的實例方法(成員方法),形參全部傳遞給該方法作為參數
        PrintString ps = new PrintString();
        usrPrinter(ps::printUpperCase);
    }

    public static void usrPrinter(Printer p) {
        p.printUpper("HelloWord!");
    }
}
HELLOWORD!
string = HELLOWORD!
Tags: