lambda表示式 的用法 方法引用

2021-09-28 21:58:06 字數 2762 閱讀 5980

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要寫的抽象體是其他方法的方法體

1.靜態方法引用

格式 :

類名::方法名

注意事項:

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

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

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

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靜態方法

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

2.物件方法引用

格式:物件名::非靜態方法名

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

@functionalinte***ce

inte***ce test

class person

}public class blog    

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

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

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

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

3.構造方法引用

格式:類名::new

注意事項:

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

inte***ce test

class person

@override

public string tostring() ';}}

public class blog }}

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

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

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

4.陣列構造方法引用

格式:資料型別[ ]::new

inte***ce test

public class blog

}5.特定型別的方法引用

格式:類名::非靜態方法

public class blog

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

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

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

6.類中方法呼叫父類或本類方法引用

格式:this::方法名

super::方法名

inte***ce test

class father

}class son extends father

public void test()

}public class blog

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

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

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

lambda表示式用法

lambda 表示式實際上是乙個函式,只是它沒有名字,叫匿名函式。c 11新增了lambda函式,其基本格式如下 捕捉列表 引數 mutable 返回值型別一 c 中使用lambda 捕捉列表 也叫 外部變數訪問方式說明符 可以是 或 表示 中用到的 定義在 外面的變數在 中是否允許被改變。表示不允...

Lambda表示式用法

c 2.0的匿名方法允許我們以內聯的方式來實現委 託例項,而c 3.0的lambda表示式允許我們使用一 種更接近人的思維 更自然的方式來實現類似於匿 名方法同樣的效果。lambda表示式格式為 引數列表 表示式或者語句塊 可以有多個引數,乙個引數,或者無引數。引數型別 可以隱式或者顯式。例如 x,...

Lambda表示式的用法

1 函式式程式設計思想概述 在數學中,函式就是有輸入量 輸出量的一套計算方案,也就是 拿什麼東西做什麼事情 相對而言,物件導向過分強調 必須通過物件的形式來做事情 而函式式思想則盡量忽略物件導向的複雜語法 強調做什麼,而不是以什麼形式做。2 lambda標準格式 lambda省去物件導向的條條框框,...