最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8與Scala中的Lambda表達(dá)式深入講解

 更新時(shí)間:2018年11月12日 16:07:59   作者:散裝海盜  
這篇文章主要給大家介紹了關(guān)于Java8與Scala中Lambda表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近幾年Lambda表達(dá)式風(fēng)靡于編程界。很多現(xiàn)代編程語言都把它作為函數(shù)式編程的基本組成部分?;贘VM的編程語言如Scala、Groovy及Clojure把它作為關(guān)鍵部分集成在語言中。而如今,(最終)Java 8也加入了這個(gè)有趣的行列。

Java8 終于要支持Lambda表達(dá)式!自2009年以來Lambda表達(dá)式已經(jīng)在Lambda項(xiàng)目中被支持。在那時(shí)候,Lambda表達(dá)式仍被稱為Java閉包。在我們進(jìn)入一些代碼示例以前,先來解釋下為什么Lambda表達(dá)式在Java程序員中廣受歡迎。

1、為什么使用Lambda表達(dá)式

Lambda表達(dá)式通常使用在圖形用戶界面(GUI)的開發(fā)中。一般來說,GUI編程將程序行為和事件做連接。比如,當(dāng)用戶按下一個(gè)按鈕(觸發(fā)一個(gè)事件),你的程序就需要去執(zhí)行某些行為,可能是將一些數(shù)據(jù)儲(chǔ)存到一個(gè)數(shù)據(jù)存儲(chǔ)器中。在Swing中,可以使用ActionListener來實(shí)現(xiàn):

class ButtonHandler implements ActionListener {
 public void actionPerformed(ActionEvent e) {
 //do something
 }
}

class UIBuilder {
 public UIBuilder() {
 button.addActionListener(new ButtonHandler());
 }
}

這個(gè)例子表明了 ButtonHandler 類作為一個(gè)回調(diào)替換的用法。在這里 ButtonHandler 類僅包含 ActionListener 接口定義的 actionPerformed 方法。我們可以使用匿名內(nèi)部類來簡化代碼:

class UIBuilder {
 public UIBuilder() {
 button.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent event) {
 //do something
 }
 })
 }
}

這樣代碼簡潔多了。更仔細(xì)的去看代碼時(shí),就會(huì)發(fā)現(xiàn)我們還創(chuàng)建一個(gè)只生成一個(gè)實(shí)例的類,而這個(gè)實(shí)例也僅僅持有一個(gè)獨(dú)立的方法。這恰好是Lambda表達(dá)式所能解決的其中一類問題。

2、Lambda表達(dá)式代替函數(shù)

一個(gè)lambda表達(dá)式從字面上講就是一個(gè)函數(shù)。它定義了一個(gè)函數(shù)的輸入?yún)?shù)和函數(shù)體。Java 8 中的,lambda表達(dá)式語法尚未確定,不過大致應(yīng)該類似這個(gè)樣子的:

(type parameter) -> function_body

一個(gè)具體的例子:

(String s1, String s2) -> s1.length() - s2.length();

這個(gè)lambda表達(dá)式用來計(jì)算兩個(gè)字符串的長度差。還有一些擴(kuò)展的語法,比如避免參數(shù)的類型定義(我們馬上見看到例子)還有使用{和}來支持多行定義。

Collections.sort() 方法是lambda表達(dá)的理想例子。它允許我們將字符串按照長度排序:

List<String> list = Array.asList("loooooong", "short", "tiny");
Collections.sort(list, (String s1, String s2) -> s1.length() - s2.length());
> "tiny", "short", "loooooong".

所以,不像現(xiàn)在java必須要求的向sort方法輸入一個(gè)已經(jīng)實(shí)現(xiàn)的Comparator(比較器)而是傳送一個(gè)lambda表達(dá)式我們就可以得到相同的結(jié)果。

3、Lambda表達(dá)式代替閉包

lambda表達(dá)式有許多有趣的特性。其中之一是,它們是閉包。一個(gè)閉包允許函數(shù)訪問直接詞法作用域之外的變量。

String outer = "java 8"
(String s1) -> s1.length() - outer.length()

在例子中,lambda表達(dá)式訪問了字符串 outer 這個(gè)作用域之外定義的變量。對(duì)于內(nèi)聯(lián)閉包來說這是很難做到的。

4、Lambda表達(dá)式也支持類型推論

類型推論是java 7 引入的但它同樣適用于lambda表達(dá)式。簡單來說,類型推論意味著程序員可以在任意一個(gè)編譯器能夠自動(dòng)推斷出類型的地方省略類型定義。

如果類型推論能夠應(yīng)用到前面的排序lambda表達(dá)式上,那么它就能寫成下面的樣子:

List<String> list = Arrays.asList(...);
Collections.sort(list, (s1, s2) -> s1.length()-s2.length());

就像你所見到的一樣,參數(shù)s1和s2的類型被省略了。因?yàn)榫幾g器知道list是一個(gè)字符串集合,它知道被用來作為比較器的lambda表達(dá)式必定是相同的類型。因此,這個(gè)類型不需要顯式地聲明,即使你有這么做的自由。

類型推論的主要優(yōu)勢就是減少樣板代碼,如果編譯器可以為我們識(shí)別類型,為什么我們必須自己定義它們。

5、珍愛Lambda表達(dá)式,遠(yuǎn)離匿名內(nèi)部類

我們來體會(huì)下,為何lambda表達(dá)式和類型推論有助于簡化我們前面所提到的回調(diào)例子:

class UIBuilder {
 public UIBuilder() {
 button.addActionListener(e -> //process ActionEvent e)
 }
}

我們下載直接傳送一個(gè)lambda表達(dá)式進(jìn)入 addActionListener 方法來代替前面定義的持有回調(diào)方法的類。除了減少模板代碼和提高可讀性以外,它使我們直接表達(dá)我們唯一感興趣的事情:處理事件。

在我們了解lambda表達(dá)式更多優(yōu)勢之前,先來看看在Scala中的lambda表達(dá)式副本。

6、Scala中的Lambda表達(dá)式

在函數(shù)式編程中,函數(shù)是基本的構(gòu)造塊。Scala融合了java中的面向?qū)ο缶幊毯秃瘮?shù)式編程。在Scala中,一個(gè)lambda表達(dá)式是種叫做“函數(shù)”或者“函數(shù)文本”。Scala中的函數(shù)屬于一等公民。它們可以被分配給vals或者vars(最終變量或者非最終變量),它們可以作為其他函數(shù)的參數(shù),也可以組合成新的函數(shù)。

在Scala中一個(gè)函數(shù)文本寫成如下形式:

(argument) => //funtion body

舉例來說,前面提到的java 用來計(jì)算兩個(gè)字符串長度差的 lambda 表達(dá)式,在Scala中寫作如下:

(s1: String, s2 :String) => s1.length - s2.length

Scala中的函數(shù)文本也是閉包。它可以訪問在直接詞法作用域之外定義的變量。

val outer =10
val myFuncLiteral = (y: Int) => y * outer
val result = myFuncLiteral(2)
> 20

這個(gè)例子結(jié)果是20.

正如你所見,我們將函數(shù)文本分配給了變量 myFuncLiteral。

java 8 的lambda表達(dá)式和Scala的函數(shù)文本在語法和語義上的相似性是十分明顯的。從語義上講它們是相同的,而語法上的唯一不同就是箭頭符號(hào)(java8 ->, scala =>)和我們沒有提到的簡化符號(hào)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式詳細(xì)代碼實(shí)例

    Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式詳細(xì)代碼實(shí)例

    在Java中我們可以使用一些現(xiàn)成的庫來實(shí)現(xiàn)XML到JSON的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • 關(guān)于SpringCloud的微服務(wù)以及組件詳解

    關(guān)于SpringCloud的微服務(wù)以及組件詳解

    這篇文章主要介紹了關(guān)于SpringCloud的微服務(wù)以及組件詳解,是一個(gè)更高層次的、 架構(gòu)視角的綜合性大型項(xiàng)目, 他的目標(biāo)是構(gòu)建一套標(biāo)準(zhǔn)化的微服務(wù)解決方案,需要的朋友可以參考下
    2023-05-05
  • java實(shí)現(xiàn)帶有背景圖片的窗體

    java實(shí)現(xiàn)帶有背景圖片的窗體

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)帶有背景圖片的窗體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java中使用ZXing和QRCode生成二維碼的示例詳解

    Java中使用ZXing和QRCode生成二維碼的示例詳解

    生成二維碼在Java中有多種方法,常用的是通過第三方庫來實(shí)現(xiàn),比較流行的庫包括?ZXing?(Zebra?Crossing)?和?QRCode,本文小編就給大家介紹了Java中使用ZXing和QRCode生成二維碼的示例,需要的朋友可以參考下
    2024-09-09
  • Idea如何集成Git&添加項(xiàng)目到git倉庫

    Idea如何集成Git&添加項(xiàng)目到git倉庫

    這篇文章主要介紹了Idea如何集成Git&添加項(xiàng)目到git倉庫,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 如何通過Java生成一個(gè)隨機(jī)數(shù)

    如何通過Java生成一個(gè)隨機(jī)數(shù)

    當(dāng)我們需要在Java中生成隨機(jī)數(shù)時(shí),可以借助JDK中提供的Random類來實(shí)現(xiàn),通過使用Random類,我們可以輕松地生成各種類型的隨機(jī)數(shù),下面我們就來看看如何利用Random類生成隨機(jī)數(shù)吧
    2023-09-09
  • 好用!解決maven包沖突的插件

    好用!解決maven包沖突的插件

    今天的主要內(nèi)容是介紹一款插件,該插件的主要用途是當(dāng)maven包沖突了以后,使用這款插件直接解決問題。
    2020-10-10
  • java獲取包下被指定注解的類過程解析

    java獲取包下被指定注解的類過程解析

    這篇文章主要介紹了java獲取包下被指定注解的類過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Maven Spring jar包啟動(dòng)報(bào)錯(cuò)問題解決方案

    Maven Spring jar包啟動(dòng)報(bào)錯(cuò)問題解決方案

    maven 編譯jar包,放在linux服務(wù)器啟動(dòng)不起來,提示:xxxx-0.0.1-SNAPSHOT.jar中沒有主清單屬性,接下來通過本文給大家分享問題原因及解決方案,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • java把excel內(nèi)容上傳到mysql實(shí)例代碼

    java把excel內(nèi)容上傳到mysql實(shí)例代碼

    這篇文章主要介紹了java把excel內(nèi)容上傳到mysql實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論

宜章县| 观塘区| 广安市| 曲阳县| 托里县| 株洲县| 信宜市| 塔河县| 刚察县| 来凤县| 城市| 富源县| 资兴市| 沾化县| 贡山| 启东市| 沈丘县| 马龙县| 兴宁市| 高陵县| 鄂伦春自治旗| 阿合奇县| 长武县| 金昌市| 河津市| 绥中县| 安徽省| 盘锦市| 林甸县| 安图县| 略阳县| 古交市| 太保市| 监利县| 尖扎县| 孙吴县| 宣化县| 沂源县| 任丘市| 巴青县| 上杭县|