lambda表示式與6種方法引用格式

2021-08-25 11:20:07 字數 3630 閱讀 8287

繼jdk 1.8之後,更新了lambda的新特性

lambda是一種強調做什麼,而不是用什麼去做的語法

而匿名內部類則是強調如何去做,用了什麼去做這件事的語法

函式式介面:有且僅有乙個抽象方法的介面,就叫函式式介面

常用@functionalinte***ce標籤標示

@functionalinte***ce

public inte***ce test

lambda表示式的前提,就是要使用函式式介面使用

比如:函式式介面作方法引數,函式式介面作方法返回值,函式式介面建立實現類物件時可以使用

格式:(抽象方法的引數)->;

!!若抽象方法引數僅有乙個時可以省略括號()

!!若抽象方法的方法體只有一條時,可以省略大括號{}和return;

作個簡單例子:

@functionalinte***ce

inte***ce test

public class blog

};test t2 = (string) -> ;

}}

這就是lambda表示式與匿名內部類的區別:

匿名內部類需要寫抽象方法的方法名等內容

而lambda只要寫清抽象方法的引數和方法體即可

由於上面的t2實現類中只傳入乙個引數所以小括號可以取消,方法體只有一條語句,大括號可以取消

寫成如下形式:

test t = string-> system.out.println(string);
方法引用:

建立了函式式介面的匿名內部類物件

重寫了函式式介面的抽象方法並在重寫的方法中呼叫被引用的方法

通俗的說,就是用lambda建立了函式式介面的實現類物件,正好lambda要寫的抽象體是其他方法的方法體

格式 :

類名::方法名

注意事項:

被引用的方法引數列表和函式式介面中抽象方法的引數一致!!

介面的抽象方法沒有返回值,引用的方法可以有返回值也可以沒有

介面的抽象方法有返回值,引用的方法必須有相同型別的返回值!!

inte***ce test 

public class blog

public static void printstring(string str, test t)

}

這個**中,利用lambda表示式建立了test介面的實現類物件,

重寫run()方法,正好方法體是靜態方法printstring方法

稍微修改一下,將函式式介面抽象方法作為乙個有返回值的方法,那麼引用方法也得有同樣型別的返回值

inte***ce test 

public class blog

public static int getinteger(string str, test t)

}

兩個例子中,分別呼叫system.out類的println靜態方法,integer類的parseint靜態方法

由於滿足抽象引數列表與引用引數列表相同,所以可以寫成靜態方法引用的格式

格式:

物件名::非靜態方法名

注意事項與靜態方法引用完全一致

@functionalinte***ce

inte***ce test

class person

}public class blog

}

類中有乙個方法gowalking()方法體是test實現類物件需要的方法體

且方法列表引數一致,返回值型別相同

則可以利用lambda建立test的實現類物件,然後重寫的抽象方法體就是呼叫person物件的gowalking方法

符合物件引用方法的所有要求,則可以寫成t2的樣式

格式:

類名::new

注意事項:

被引用的類必須存在乙個構造方法與函式式介面的抽象方法引數列表一致

inte***ce test 

class person

@override

public string tostring() ';

}}public class blog

}}

由於函式式介面test中抽象方法,返回值是person物件,且引數列表與person類中的構造方法相同

則可以通過建立函式式介面的實現類物件,方法體通過呼叫類中的構造方法建立物件

使用了構造方法引用寫成了**中t2的形式

格式:

資料型別[ ]::new

inte***ce test 

public class blog

}

格式:

類名::非靜態方法

public class blog 

}

特定型別方法引用,在comparator函式式介面的抽象方法中傳入的引數有兩個,

可是comparetoignorecase()方法引數只有乙個,第乙個傳入的引數作呼叫物件

這就滿足了特定型別的方法引用,所以可以簡化成類名::非靜態方法的形式

格式:

this::方法名

super::方法名

inte***ce test 

class father

}class son extends father

public void test()

}public class blog

}

在有繼承關係的類中,若方法想呼叫本類或父類的成員方法

在函式式介面抽象方法與成員方法引數列表相同,且返回值型別相同的情況下

也可以使用this和super的方法引用來簡寫原本的lambda**

匿名方法與Lambda表示式

匿名方法的概念 這個方法沒有具體的名稱,而只有委託關鍵字 方法引數 方法體,所以稱為匿名方法,匿名方法允許將 塊通過委託變數作為引數傳遞,以代替單獨定義的方法。首先宣告乙個委託 public delegate int calculatordelegate int a,int b 然後使用匿名方法 c...

匿名方法與lambda表示式

匿名方法,從字面上理解即是沒有名字的的方法。用delegate關鍵字進行宣告且只能賦值給乙個委託 for example1 static void main string args ps 經常用作 從c 3.0後又開始使用lambda表示式來代替匿名函式,只要在有委託引數型別的地方就可以使用lamb...

DAY6 函式與Lambda表示式

no.5函式與lambda表示式 一 函式 1 建立函式def 語法 def myfunction 語句2 呼叫函式 語法 myfunction 函式內容 3 函式的引數 e.g.def a name print name 少年 a 壁花 壁花少年 e.g.def add b,c result b ...