亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java8與Scala中的Lambda表達式深入講解

2024-07-14 08:42:49
字體:
來源:轉載
供稿:網友

前言

最近幾年Lambda表達式風靡于編程界。很多現代編程語言都把它作為函數式編程的基本組成部分。基于JVM的編程語言如Scala、Groovy及Clojure把它作為關鍵部分集成在語言中。而如今,(最終)Java 8也加入了這個有趣的行列。

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

1、為什么使用Lambda表達式

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

class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { //do something }}class UIBuilder { public UIBuilder() { button.addActionListener(new ButtonHandler()); }}

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

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

這樣代碼簡潔多了。更仔細的去看代碼時,就會發現我們還創建一個只生成一個實例的類,而這個實例也僅僅持有一個獨立的方法。這恰好是Lambda表達式所能解決的其中一類問題。

2、Lambda表達式代替函數

一個lambda表達式從字面上講就是一個函數。它定義了一個函數的輸入參數和函數體。Java 8 中的,lambda表達式語法尚未確定,不過大致應該類似這個樣子的:

(type parameter) -> function_body

一個具體的例子:

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

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

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

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

所以,不像現在java必須要求的向sort方法輸入一個已經實現的Comparator(比較器)而是傳送一個lambda表達式我們就可以得到相同的結果。

3、Lambda表達式代替閉包

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

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

在例子中,lambda表達式訪問了字符串 outer 這個作用域之外定義的變量。對于內聯閉包來說這是很難做到的。

4、Lambda表達式也支持類型推論

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

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

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

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

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

5、珍愛Lambda表達式,遠離匿名內部類

我們來體會下,為何lambda表達式和類型推論有助于簡化我們前面所提到的回調例子:

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

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

在我們了解lambda表達式更多優勢之前,先來看看在Scala中的lambda表達式副本。

6、Scala中的Lambda表達式

在函數式編程中,函數是基本的構造塊。Scala融合了java中的面向對象編程和函數式編程。在Scala中,一個lambda表達式是種叫做“函數”或者“函數文本”。Scala中的函數屬于一等公民。它們可以被分配給vals或者vars(最終變量或者非最終變量),它們可以作為其他函數的參數,也可以組合成新的函數。

在Scala中一個函數文本寫成如下形式:

(argument) => //funtion body

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

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

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

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

這個例子結果是20.

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本久久亚洲电影| 欧美劲爆第一页| 俺也去精品视频在线观看| 久久青草福利网站| 国产亚洲精品久久久久动| 日韩影视在线观看| 日产精品久久久一区二区福利| 欧美性猛交xxxx| 欧美怡红院视频一区二区三区| 亚洲精品自拍偷拍| 在线电影欧美日韩一区二区私密| 韩国视频理论视频久久| 欧美与欧洲交xxxx免费观看| 欧美床上激情在线观看| 国产精品88a∨| 中文字幕亚洲综合久久| 亚洲欧美精品中文字幕在线| 久久久久久美女| 日本午夜人人精品| 国产精品日韩在线| 亚洲国产古装精品网站| 国产美女主播一区| 性色av一区二区三区在线观看| 26uuu亚洲伊人春色| 亚洲va久久久噜噜噜| 欧美第一页在线| 日本a级片电影一区二区| 亚洲va久久久噜噜噜| 91美女片黄在线观| 日韩黄色av网站| 中文字幕亚洲无线码a| 久久99亚洲热视| 欧美激情亚洲另类| 韩国三级日本三级少妇99| 欧美亚洲国产日韩2020| 日韩精品电影网| 欧美成人全部免费| 欧美中文在线免费| 91成人国产在线观看| 精品国产一区二区三区在线观看| 国产免费一区二区三区在线观看| 久久精品99久久久香蕉| 欧美成人手机在线| 一区二区欧美亚洲| 久久激情五月丁香伊人| 欧美多人乱p欧美4p久久| 色悠悠久久88| 国产福利精品av综合导导航| 97精品久久久| 怡红院精品视频| 日韩中文字幕在线看| 久久91精品国产91久久久| 欧美日韩一区二区三区| 亚洲精品动漫100p| 亚洲无亚洲人成网站77777| 精品视频在线播放| 91av国产在线| 国产成人欧美在线观看| 精品国产自在精品国产浪潮| 日韩中文视频免费在线观看| 在线看国产精品| 国产精品美女久久久久av超清| 国产欧美一区二区三区久久人妖| 国产欧美日韩专区发布| 国内成人精品一区| 69影院欧美专区视频| 久久精品亚洲94久久精品| 久久视频国产精品免费视频在线| 欧美激情综合色综合啪啪五月| 亚洲资源在线看| 国产综合在线观看视频| 欧美日韩国产一中文字不卡| 国模视频一区二区| 日韩在线精品一区| 亚洲无限av看| 2020国产精品视频| 色综合久久悠悠| 免费99精品国产自在在线| 久久精品久久久久久| 136fldh精品导航福利| 国产在线拍揄自揄视频不卡99| 亚洲色图综合久久| 怡红院精品视频| 国产美女直播视频一区| 91精品久久久久久久久久久久久| 8x海外华人永久免费日韩内陆视频| 国产精品电影网站| 成人天堂噜噜噜| 国产精品情侣自拍| 精品视频在线观看日韩| 欧美成人在线免费视频| 日韩电影中文字幕av| 亚洲一区二区免费在线| 日韩欧美综合在线视频| 国产伊人精品在线| 在线观看日韩欧美| 欧美亚洲视频在线观看| 成人激情视频小说免费下载| 日韩在线观看网址| 亚洲自拍偷拍网址| 亚洲成人免费网站| 日韩综合中文字幕| 日本精品va在线观看| 色综合久久精品亚洲国产| 色偷偷亚洲男人天堂| 亚洲3p在线观看| 国产一区二区三区视频在线观看| 欧美精品久久久久久久久| 久久精品国产2020观看福利| 久久精品国产成人精品| 国产91精品高潮白浆喷水| 欧美综合激情网| 欧美一级大片在线免费观看| 欧美华人在线视频| 国产伦精品一区二区三区精品视频| 欧洲亚洲在线视频| 日韩欧美在线视频日韩欧美在线视频| 日韩中文在线视频| 黑人精品xxx一区一二区| 在线免费观看羞羞视频一区二区| 亚洲开心激情网| 久久夜色精品国产欧美乱| 国产激情久久久| 人九九综合九九宗合| 日韩一区在线视频| 91亚洲精品在线观看| 国产精品电影久久久久电影网| 亚洲嫩模很污视频| 91精品久久久久久久久久入口| 国产视频精品va久久久久久| 亚洲欧美日本精品| 久久伊人精品天天| 91久久久久久久久久久久久| 欧美电影在线观看高清| 精品久久久在线观看| 国产深夜精品福利| 国产在线久久久| 欧美夫妻性视频| 久热爱精品视频线路一| 午夜精品一区二区三区视频免费看| 成人福利网站在线观看| 日韩网站免费观看高清| 黑人精品xxx一区一二区| 欧美黑人xxxⅹ高潮交| 91国内精品久久| 色噜噜狠狠色综合网图区| 亚洲激情久久久| 久久久久久久香蕉网| 国产精品久久久久久久一区探花| 欧美国产日产韩国视频| 青草热久免费精品视频| 波霸ol色综合久久| 亚洲成人1234| 不卡在线观看电视剧完整版| 日韩不卡中文字幕| 国产亚洲精品激情久久| 北条麻妃一区二区三区中文字幕| 日韩中文字幕在线播放| 久久国产精品99国产精| 亚洲天堂2020| 亚洲欧美日韩另类| 亚洲精品97久久| 欧美俄罗斯性视频| 性欧美激情精品|