


成都java開發培訓
達內成都高升橋中心
在JDK1.8中,方法引用同Lambda表達式一齊作為新特性被引用。它是一種比Lambda表達式更加簡便的書寫方式,旨在使用通用的解決方案來減少代碼冗余。
下面先介紹使用,再進一步思考。
一、書寫格式
方法引用符:::,它所在的表達式被稱為方法引用
格式:引用類::引用的方法示例:System.out::println二、使用方式
下面通過使用方式來認識方法引用
1.引用類方法
引用類方法,即引用類的靜態方法。
格式:類名::靜態方法示例:
以引用Integer.parseInt為例。設存在一個接口Interface01,其中只包含一個抽象方法,希望實現類可以實現將傳入的字符串轉換為int類型。
public interface Interface01 {
int toInt(String s);
}
在測試方法seeInt中,使用了該接口的toInt方法
private static void seeInt(Interface01 i){
int i1 = i.toInt("666");
//通過運算符,可以在調用后通過輸出結果看出 i1 是String還是int
System.out.println(i1+222);
}
現在使用測試類來提供接口的實現。此處提供三種實現方式以便于比較
public class Demo1 {
public static void main(String[] args) {
//我們常用Integer.parseInt來實現將String轉換為int
//匿名內部類方式。
seeInt(new Interface01() {
@Override
public int toInt(String s) {
return Integer.parseInt(s);
}
});
//Lambda表達式
seeInt(s -> Integer.parseInt(s));
//方法引用。
//引用Integer類中的parseInt靜態方法
seeInt(Integer::parseInt);
}
private static void seeInt(Interface01 i){
int i1 = i.toInt("666");
//通過運算符,可以在調用后通過輸出結果看出 i1 是String還是int
System.out.println(i1+222);
}
}
得到輸出結果
888
888
888
在該例中,將String轉換為int已經有一個成熟的解決方案,即Integer.parseInt。所以直接引用了該方法。此時,Integer.parseInt就是Interface01接口中toInt抽象方法的具體實現
此時出現一個疑問,引用的這個方法是怎么處理參數的?
我們可以對比一下:
toInt方法需要一個入參(String),返回一個出參(int)
Integer.parseInt重載中存在一個方法是 需要一個入參(String),返回一個出參(int)
此時兩者可以對應上,編譯器將自動處理傳參問題。
2.引用對象的實例方法
引用對象的實例方法。和引用類的靜態方法在使用上沒有什么區別只是將類變更為對象。注意:對象需要實例化
格式:對象名::方法名示例:
public class Demo3 {
public static void main(String[] args) {
//引用對象的實例方法。和靜態方法沒有使用上的區別只是要new一下
Demo3 demo3 = new Demo3();
useInterface(demo3::method1);
}
private static void useInterface(Interface03 i){
i.abMethod1();
}
public void method1(){
System.out.println("111");
System.out.println("222");
System.out.println("333");
}
}
interface Interface03 {
void abMethod1();
}
3.特殊類型的實例方法
java中存在某些特殊方法。
以"".subString([start],[end])為例,它在使用時需要三個參數,即
被截取的字符串(“”)
截取的開始下標([start])
截取的結束下標([end])
示例:使用Lambda和方法引用使用格式為:
public static void main(String[] args) {
//lambda
testInterface((s,start,end) -> s.substring(start,end));
/*
方法引用
第一個參數作為方法調用者
后面的參數作為方法的參數
*/
testInterface(String::substring);
}
4.構造方法引用
直接上代碼演示
格式:類名::new示例:
public static void main(String[] args) {
//Lambda
seeStudent((name,age) -> {
return new Student(name,age);
});
//方法引用 他的形式參數全部傳遞給構造器
seeStudent(Student::new);
}
思考
學習一個新知識的時候,我總有這樣的疑問:為什么要學它,什么時候去用它,怎么用它呢?(這個和高中作文的議論文格式一樣...看來學議論文還是有幫助的=。=)
所以此處的問題是:為什么需要方法引用,什么時候使用方法引用呢?
在方法引用的學習時,我產生了這樣的思考
當接口只需要實現一次 -> 使用匿名內部類
作為匿名內部類的簡便寫法 -> 使用Lambda表達式
當Lambda的實現存在通用解決方案 -> 使用方法引用
當”一個接口/類的方法的某個實現方式在程序中只會執行一次“時,為了減少代碼量,我們會使用匿名內部類。
而使用方法引用會引用一個通用解決方案,此時該解決方案就不屬于”只使用一次”的了。
換言之,
當程序中使用到接口,接口在某個類中已存在實現方式,就可以考慮使用“方法引用”的方式來簡化書寫
總結:
方法引用是Lambda的一種簡便寫法
使用方法引用可以減少重復代碼,減少冗余