• <xmp id="miewm"><strong id="miewm"></strong>
  • 成都java開發培訓
    達內成都高升橋中心

    成都java程序員培訓:方法引用

    • 時間:2020-12-22 11:36
    • 發布:成都達內
    • 來源:成都達內

    在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的一種簡便寫法

    使用方法引用可以減少重復代碼,減少冗余

    上一篇:成都java程序員學習:一個bug來理解Spring單例
    下一篇:成都java培訓機構:微服務之間是如何獨立通訊的

    成都java程序員學習:一個bug來理解Spring單例

    成都java程序員學習:Java的橋接方法

    成都java程序員培訓:正則表達式筆記

    成都java程序員:java中將list轉換為用逗號隔開的字符串、逗號拼接字符串

    選擇城市和中心
    江西省

    貴州省

    廣西省

    海南省

    偷拍初高中女厕所视频