方法引用
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!