java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...
溫馨提示:如果想學(xué)扎實(shí),一定要從頭開始看凱哥的一系列文章(凱哥帶你從零學(xué)大數(shù)據(jù)系列),千萬不要從中間的某個部分開始看,知識前后是有很大關(guān)聯(lián),否則學(xué)習(xí)效果會打折扣.
系列文章第一篇是擁抱大數(shù)據(jù):凱哥帶你從零學(xué)大數(shù)據(jù)系列-學(xué)習(xí)大數(shù)據(jù)前奏(必讀)(點(diǎn)我)!
課程重點(diǎn):
1 函數(shù)式接口函數(shù)式接口的概念函數(shù)式接口的判斷@FunctionalInterface 2 lambda表達(dá)式的語法基礎(chǔ)的語法語法的精簡(參數(shù)、方法體) 3 函數(shù)引用靜態(tài)、非靜態(tài)、構(gòu)造方法的引用對象方法的特殊引用22.1. Lambda表達(dá)式的簡介
22.1.1. Lambda表達(dá)式的概念
lambda表達(dá)式, 是Java8的一個新特性, 也是Java8中最值得學(xué)習(xí)的新特性之一。
lambda表達(dá)式, 從本質(zhì)來講, 是一個匿名函數(shù)。 可以使用使用這個匿名函數(shù), 實(shí)現(xiàn)接口中的方法。 對接口進(jìn)行非常簡潔的實(shí)現(xiàn), 從而簡化代碼。
22.1.2. Lambda表達(dá)式的使用場景
通常來講, 使用lambda表達(dá)式, 是為了簡化接口實(shí)現(xiàn)的。
關(guān)于接口實(shí)現(xiàn), 可以有很多種方式來實(shí)現(xiàn)。 例如: 設(shè)計(jì)接口的實(shí)現(xiàn)類、 使用匿名內(nèi)部類。 但是lambda表達(dá)式, 比這兩種方式都簡單。
/**22.1.3. Lambda表達(dá)式對接口的要求
雖然說, lambda表達(dá)式可以在一定程度上簡化接口的實(shí)現(xiàn)。 但是, 并不是所有的接口都可以使用lambda表達(dá)式來簡潔實(shí)現(xiàn)的。
lambda表達(dá)式畢竟只是一個匿名方法。 當(dāng)實(shí)現(xiàn)的接口中的方法過多或者多少的時候, lambda表達(dá)式都是不適用的。
lambda表達(dá)式,只能實(shí)現(xiàn)函數(shù)式接口。
22.1.4. 函數(shù)式接口
22.1.4.1. 基礎(chǔ)概念
如果說, 一個接口中, 要求實(shí)現(xiàn)類必須實(shí)現(xiàn)的抽象方法, 有且只有一個! 這樣的接口, 就是函數(shù)式接口。
// 這個接口中, 有且只有一個方法, 是實(shí)現(xiàn)類必須實(shí)現(xiàn)的, 因此是一個函數(shù)式接口 思考題: 下面的兩個接口是不是函數(shù)式接口?interface Test7 {String toString(); }interface Test8 {void test();default void test1() {}static void test2() {}String toString(); }22.1.4.2. @FunctionalInterface
是一個注解, 用在接口之前, 判斷這個接口是否是一個函數(shù)式接口。 如果是函數(shù)式接口, 沒有任何問題。 如果不是函數(shù)式接口, 則會報(bào)錯。 功能類似于 @Override。
@FunctionalInterface22.1.4.3. 系統(tǒng)內(nèi)置的若干函數(shù)式接口
22.2. Lambda表達(dá)式的語法
22.2.1. Lambda表達(dá)式的基礎(chǔ)語法
lambda表達(dá)式, 其實(shí)本質(zhì)來講, 就是一個匿名函數(shù)。 因此在寫lambda表達(dá)式的時候, 不需要關(guān)心方法名是什么。
實(shí)際上, 我們在寫lambda表達(dá)式的時候, 也不需要關(guān)心返回值類型。
我們在寫lambda表達(dá)式的時候, 只需要關(guān)注兩部分內(nèi)容即可: 參數(shù)列表 和 方法體
lambda表達(dá)式的基礎(chǔ)語法:
(參數(shù)部分 : 方法的參數(shù)列表, 要求和實(shí)現(xiàn)的接口中的方法參數(shù)部分一致, 包括參數(shù)的數(shù)量和類型。
方法體部分 : 方法的實(shí)現(xiàn)部分, 如果接口中定義的方法有返回值, 則在實(shí)現(xiàn)的時候, 注意返回值的返回。
-> : 分隔參數(shù)部分和方法體部分。
/**22.2.2. Lambda表達(dá)式的語法進(jìn)階
在上述代碼中, 的確可以使用lambda表達(dá)式實(shí)現(xiàn)接口, 但是依然不夠簡潔, 有簡化的空間。
22.2.2.1. 參數(shù)部分的精簡
- 參數(shù)的類型
- 由于在接口的方法中,已經(jīng)定義了每一個參數(shù)的類型是什么。 而且在使用lambda表達(dá)式實(shí)現(xiàn)接口的時候, 必須要保證參數(shù)的數(shù)量和類型需要和接口中的方法保持一致。 因此, 此時lambda表達(dá)式中的參數(shù)的類型可以省略不寫。
- 注意事項(xiàng):
- 如果需要省略參數(shù)的類型, 要保證: 要省略, 每一個參數(shù)的類型都必須省略不寫。 絕對不能出現(xiàn), 有的參數(shù)類型省略了, 有的參數(shù)類型沒有省略。
- 參數(shù)的小括號
- 如果方法的參數(shù)列表中的參數(shù)數(shù)量 有且只有一個 ,此時,參數(shù)列表的小括號是可以省略不寫的。
- 注意事項(xiàng):
- 只有當(dāng)參數(shù)的數(shù)量是一個的時候, 多了、少了都不能省略。
- 省略掉小括號的同時, 必須要省略參數(shù)的類型。
22.2.2.2. 方法體部分的精簡
- 方法體大括號的精簡
- 當(dāng)一個方法體中的邏輯, 有且只有一句的情況下, 大括號可以省略。
- return的精簡
- 如果一個方法中唯一的一條語句是一個返回語句, 此時在省略掉大括號的同時, 也必須省略掉return。
22.3. 函數(shù)引用
lambda表達(dá)式是為了簡化接口的實(shí)現(xiàn)的。 在lambda表達(dá)式中, 不應(yīng)該出現(xiàn)比較復(fù)雜的邏輯。 如果在lambda表達(dá)式中出現(xiàn)了過于復(fù)雜的邏輯, 會對程序的可讀性造成非常大的影響。 如果在lambda表達(dá)式中需要處理的邏輯比較復(fù)雜, 一般情況會單獨(dú)的寫一個方法。 在lambda表達(dá)式中直接引用這個方法即可。
或者, 在有些情況下, 我們需要在lambda表達(dá)式中實(shí)現(xiàn)的邏輯, 在另外一個地方已經(jīng)寫好了。 此時我們就不需要再單獨(dú)寫一遍, 只需要直接引用這個已經(jīng)存在的方法即可。函數(shù)引用: 引用一個已經(jīng)存在的方法, 使其替代lambda表達(dá)式完成接口的實(shí)現(xiàn)。
22.3.1. 靜態(tài)方法的引用
- 語法:
- 類::靜態(tài)方法
- 注意事項(xiàng):
- 在引用的方法后面, 不要添加小括號。
- 引用的這個方法, 參數(shù)(數(shù)量、類型) 和 返回值, 必須要跟接口中定義的一致。
- 示例:
22.3.2. 非靜態(tài)方法的引用
- 語法:
- 對象::非靜態(tài)方法
- 注意事項(xiàng):
- 在引用的方法后面, 不要添加小括號。
- 引用的這個方法, 參數(shù)(數(shù)量、類型) 和 返回值, 必須要跟接口中定義的一致。
- 示例:
22.3.3. 構(gòu)造方法的引用
- 使用場景
如果某一個函數(shù)式接口中定義的方法, 僅僅是為了得到一個類的對象。 此時我們就可以使用構(gòu)造方法的引用, 簡化這個方法的實(shí)現(xiàn)。
- 語法
類名::new
- 注意事項(xiàng)
可以通過接口中的方法的參數(shù), 區(qū)分引用不同的構(gòu)造方法。
- 示例
22.3.4. 對象方法的特殊引用
如果在使用lambda表達(dá)式,實(shí)現(xiàn)某些接口的時候。 lambda表達(dá)式中包含了某一個對象, 此時方法體中, 直接使用這個對象調(diào)用它的某一個方法就可以完成整體的邏輯。 其他的參數(shù), 可以作為調(diào)用方法的參數(shù)。 此時, 可以對這種實(shí)現(xiàn)進(jìn)行簡化。
/**22.4. Lambda表達(dá)式需要注意的問題
這里類似于局部內(nèi)部類、匿名內(nèi)部類,依然存在閉包的問題。
如果在lambda表達(dá)式中,使用到了局部變量,那么這個局部變量會被隱式的聲明為 final。 是一個常量, 不能修改值。
22.5. Lambda表達(dá)式的實(shí)例
22.5.1. 線程的實(shí)例化
Thread22.5.2. 集合的常見方法
ArrayList22.5.3. 集合的流式編程
ArrayList總結(jié)
以上是生活随笔為你收集整理的java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实际应用方面的材料_pyth
- 下一篇: 信誉积分上限几点更新