Java 8新特性學習之一:Java 8 lambda表示式初步第六回

孫小光發表於2016-07-02

在這次,我們來說Java8中關於lambda表示式的最一個部分方法引用,我認為主法引用的好處。就是可以引用類中定義的方法,使其實現引數化進行傳遞。 方法引用分類:靜態方法引用、例項方法引用、泛型方法引用建構函式引用等。下面我們來具體說一下。
一、靜態方法引用
看標題就知道,用函式式介面引用定義在類中的靜態方法一般的形式如下:
類名::靜態方法名
與之對應的函式式介面,還是一樣的要求。就是在引數類、引數數量、丟擲的異常和返回的型別,都要與類中定義的靜態方法保持一致。
下面是一個例子:

interface Abc{
    public int getVal(int val1);
}
class Modify2{
    public static int getModify(int val1);
}
public class Modify1{
    public static int getModify1(Abc abc,int val1){
        return abc.getVal(val1);
    }
    public static void main(String[] args){
        System.out.println(getModify1(Modify2::getModify,10));
    }
}  

例子的輸出結果為100。
二、例項方法引用
例項方法引用分類兩種情況:
1.以類宣告的變數引用類的例項方法,例項變數::例項方法名
2.以類名稱引用類的例項變數,類名稱::例項方法名
以上兩種情況的區別在於,第二種情況與之匹配的函式式介面中方法的定義形式比較特殊。以下是例子。
例1:

interface Abc{
    public int QiuHe(int val1,int val2);
}
class Modify4_1{
    public int SLqiuhe(int val1,int val2){
        return val1+val2;
    }
}
public class Modify4 {
    public static int JTqiuhe(Abc abc,int val1,int val2){
        return abc.QiuHe(val1, val2);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Modify4_1 m4_1 = new Modify4_1();
        System.out.println(JTqiuhe(m4_1::SLqiuhe,10,10));
    }
}  

執行結果為:20。
例2:

interface Abc1{
    public int QiuHe(Modify6 m6_1,int val1,int val2);
}
class Modify6{
    private int index = 0;
    public Modify6(int index){
        this.index=index;
    }
    public int SLqiuhe(int val1,int val2){
        return val1+val2+this.index;
    }
 }
 public class Modify5 {
    public static int ReturnSum(Abc1 abc,int val1,int val2,Modify6 m6_1){
        return abc.QiuHe(m6_1,val1,val2);
    }
    public static void main(String[] args){
        Modify6 m6_1 = new Modify6(200);
        System.out.print(Modify5.ReturnSum(Modify6::SLqiuhe,10,10,m6_1));
    }
}  

執行結果為:220。

另外一點,通過使用super,可以引用方法的超類版本,如下所示:
super::name
方法的名稱由name指定。
三、泛型方法引用
泛型方法引用分為:泛型類中的方法引用非泛型類中的泛型方法引用
泛型類中的方法引用例子如下:

相關文章