大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java8有哪些新特性?Lambda的詳細分析

Java8有哪些新特性?Lambda的詳細分析

更新時間:2020-06-08 16:25:56 來源:動力節點 瀏覽2673次

為什么要Lambda#

Java8應該是目前最大的一次更新了,更新后我們迎來了很多新特性,其中便包括Lambda表達式,函數式編程的思想正式進入Java,讓我們看一個經典案例。

例1按照兩個人的年齡排序的功能#

采用匿名內部類已經算簡介了,如果專門用一個類去實現Comparator再new出來就更煩了,過去的寫法:

Copy//?已經創建好了三個Person實例
List<Person>?people?=?Arrays.asList(person1,?person2,?person3);

Collections.sort(people,?new?Comparator<Person>()?{
????@Override
????public?int?compare(Person?o1,?Person?o2)?{
????????return?o1.getAge().compareTo(o2.getAge());
????}
});

Lambda版本寫法:

CopyCollections.sort(people,(p1,p2)-&gt;p1.getAge().compareTo(p2.getAge()));

還有更簡潔的方法引用寫法:

CopyCollections.sort(people,Comparator.comparing(Person::getAge));

是不是真的短真的易讀,語法糖真的甜!已經9102年了,函數式編程被提到的越來越多,深諳照貓畫虎已經行不通了,而且函數式編程和設計模式的碰撞也很多,真的有必要了解下相關概念

哪里用Lambda#

行為參數化#

函數式編程是一種思想,核心是行為參數化,把一段代碼像值一樣傳遞給方法,傳入不同的代碼實現不同的功能

這是不是很像策略模式以及模板模式?如例1所示,不需要大量的套路代碼了,也不需要把代碼寫到一個類中然后新建實例對象最后把實例對象傳遞

函數式接口#

函數式接口就是只定義一個抽象方法的接口來表示行為,抽象方法不允許拋出受檢異常,Java8接口可以有default方法了,函數式接口是允許有default方法的

Lambda表達式看上去確實很有吸引力,我能在任何地方都使用么?答案是不能的,我們只能通過Lambda表達式把代碼傳到函數式接口中,拿例1中的Comparator接口來看

Copy FunctionalInterface
public interface Comparator&lt;T&gt;{
int compare(T o1,T o2);
}

Comparator接口只有compare一個抽象方法,Java8特意給它加了注解告訴我們這就是個函數式接口,其實也很好理解,我們沒有創建任何實例,只傳了一串代碼,如果Comparator有兩個抽象方法,編譯器怎么知道我們實現的是compare方法呢

怎么用Lambda#

上面都是說的函數式編程,那么什么是Lambda

Lambda就是匿名的行為參數化的一種語法實現,它沒有名稱,但它有參數列表、函數主體、返回類型,可能還有一個可以拋出的異常列表

語法#

(parameters)-&gt;expression默認Return的,expression只能是一句代碼

(parameters)-&gt;{statements;}沒有默認Retrun,就相當于Comparator.compare(statements;),statements可以是好多行

tips:如果statements很長,那么我們就不應該用Lambda,而應該單獨實現一個方法,然后使用方法引用這樣可讀性更好,繼續例1

Copy//?比如說在MyUtils類下寫個方法,故意加長
public?static?Integer?sortPersonByName(Person?person1,?Person?person2)?{
????Integer?age1?=?person1.getAge();
????Integer?age2?=?person2.getAge();
????return?age1.compareTo(age2);
}

//?又用到了方法引用,我們可以把方法引用當作一種便于閱讀的語法糖,功能也是傳遞代碼
Collections.sort(people,?MyUtils::sortPersonByAge);

憑什么Lambda#

在使用Lambda的時候我們沒有任何類型聲明就能工作這是怎么做到的呢?

函數描述符#

函數式接口的抽象方法的簽名基本上就是Lambda表達式的簽名。我們將這種抽象方法叫作函數描述符

Comparator.compare的簽名

Copyint compare(T o1,T o2);

這個函數式接口的簽名就可以描述成需要兩個相同類型的變量,然后返回int

(T,T)-&gt;int

Lambda的簽名

Copy(p1,p2)-&gt;p1.getAge().compareTo(p2.getAge())//這是易讀的寫法,我們也可以寫成方便說明(Person p1,Person p2)-&gt;p1.getAge().compareTo(p2.getAge())

可以描述成需要兩個Person變量,然后compareTo方法返回int

(Person,Person)-&gt;int

編譯器會做類型推斷和類型檢查,發現兩個簽名匹配,我們的Lambda表達式就可以順利執行了

tips:Lambda主體是語句表達式的時候(parameters)-&gt;expression,盡管expression返回可能不是void,但是也是兼容T-&gt;void簽名的

進階#

新增函數式接口#

除了Runnable,Comparator等常用函數式接口,為了推動函數式編程,Java8又在java.util.function包下為我們提供了大量好用的函數式,因為基本數據類型不能抽象成對象,所以可以看到有大量Double,Int,Long前綴的接口,我們只看比較核心的:

接口名抽象方法描述符Predicateboolean test(T t)T-&gt;booleanBiPredicate&lt;T,U&gt;test(T t,U u)(T,U)-&gt;booleanConsumervoid accept(T t)T-&gt;voidBiConsumer&lt;T,U&gt;void accept(T t,U u)(T,U)-&gt;voidFunction&lt;T,R&gt;R apply(T t)T-&gt;RBiFunction&lt;T,U,R&gt;R apply(T t,U u)(T,U)-&gt;RSupplierT get()void-&gt;T

tips:Predicate這種對給定內容做判斷返回boolean值,我們叫做謂詞

復合Lambda#

令人驚喜的是,java8提供的函數式接口還有許多好用的default方法,可以讓我們把多個Lambda復合起來,組成流水線。拿用的比較多的Function接口舉例,我們要寫一封郵件,我們關注的是信的內容

CopyFunction<String,?String>?writeEmailHeader?=?text?->?"Hi?,"?+?"\n"?+?text;
Function<String,?String>?writeEmailText?=?text?->?text?+?"\n";
Function<String,?String>?writeEmailFooter?=?text?->?text?+?"BRs"?+?"\n"?+?"Chen";
Function<String,?String>?writeEmail?=?writeEmailHeader.andThen(writeEmailText).andThen(writeEmailFooter);

System.out.println(writeEmail.apply("I?will?take?half?day?sick?leave?today"));
/**
?*?輸入如下:
?*?Hi?,
?*?I?will?take?half?day?sick?leave?today
?*?BRs
?*?Chen
?*/

以上就是動力節點java培訓機構的小編針對“Java8有哪些新特性?Lambda的詳細分析”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 成人小视频免费观看 | 国产手机在线视频放线视频 | 国产激情一区二区三区在线观看 | 亚洲国产一成人久久精品 | 亚洲精品免费视频 | 97在线视频免费观看 | 欧美激情久久久久久久大片 | 精品国产系列 | 久久免费99精品久久久久久 | 影音先锋久草 | 久久91精品国产91久久户 | 日韩一区二区三区不卡视频 | 特黄特色大片免费播放器999 | 91久久综合九色综合欧美98 | 在线亚洲国产精品区 | 国产福利99 | 99国产精品久久久久久久日本 | 天天操狠狠操夜夜操 | 国产91在线|亚洲 | 毛片免费全部播放一级 | 日韩一级大片 | 神马啪啪 | 久久精品图片 | 免费中文字幕不卡视频 | 久草视频播放器 | 五月激情丁香婷婷综合第九 | 日韩欧美在线观看 | 91成人午夜在线精品 | 日本高清中文字幕 | 亚洲最新在线视频 | 中文字幕51精品乱码在线 | 欧美金妇欧美乱妇xxxx | 俺去也理论网站 | 一区二区三区日韩精品 | 欧美成人性videos | 99久久国产综合精麻豆 | 日本不卡三区 | 一级午夜a毛片免费视频 | 久久久久久久99久久久毒国产 | 国产手机在线视频放线视频 | 欧美日韩激情在线一区二区 |