国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java8與Scala中的Lambda表達式深入講解

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

2021-06-11 13:52散裝海盜 Java教程

這篇文章主要給大家介紹了關于Java8與Scala中Lambda表達式的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

最近幾年lambda表達式風靡于編程界。很多現(xiàn)代編程語言都把它作為函數式編程的基本組成部分。基于jvm的編程語言如scala、groovy及clojure把它作為關鍵部分集成在語言中。而如今,(最終)java 8也加入了這個有趣的行列。

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

1、為什么使用lambda表達式

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

?
1
2
3
4
5
6
7
8
9
10
11
class buttonhandler implements actionlistener {
 public void actionperformed(actionevent e) {
 //do something
 }
}
 
class uibuilder {
 public uibuilder() {
 button.addactionlistener(new buttonhandler());
 }
}

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

?
1
2
3
4
5
6
7
8
9
class uibuilder {
 public uibuilder() {
 button.addactionlistener(new actionlistener() {
 public void actionperformed(actionevent event) {
 //do something
 }
 })
 }
}

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

2、lambda表達式代替函數

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

?
1
(type parameter) -> function_body

一個具體的例子:

?
1
(string s1, string s2) -> s1.length() - s2.length();

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

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

?
1
2
3
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方法輸入一個已經實現(xiàn)的comparator(比較器)而是傳送一個lambda表達式我們就可以得到相同的結果。

3、lambda表達式代替閉包

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

?
1
2
string outer = "java 8"
(string s1) -> s1.length() - outer.length()

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

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

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

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

?
1
2
list<string> list = arrays.aslist(...);
collections.sort(list, (s1, s2) -> s1.length()-s2.length());

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

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

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

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

?
1
2
3
4
5
class uibuilder {
 public uibuilder() {
 button.addactionlistener(e -> //process actionevent e)
 }
}

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

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

6、scala中的lambda表達式

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

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

?
1
(argument) => //funtion body

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

?
1
(s1: string, s2 :string) => s1.length - s2.length

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

?
1
2
3
4
val outer =10
val myfuncliteral = (y: int) => y * outer
val result = myfuncliteral(2)
> 20

這個例子結果是20.

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

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

總結

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

原文鏈接:https://yq.aliyun.com/articles/657841

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成av在线| 久久99国产精品久久99果冻传媒 | 黄色毛片a | 中文字幕乱码视频32 | 欧美一级在线观看 | 欧美一区二区三区的 | 精品无码久久久久国产 | 嫩草网址| 中文字幕高清在线 | 亚洲天堂av影院 | 欧美成人精品一区二区男人看 | 一区二区三区视频 | 一级在线看 | 毛片网站大全 | 免费毛片在线 | 久久极品| 成人片在线播放 | 午夜在线电影 | 免费久久99精品国产婷婷六月 | 中文字幕亚洲欧美日韩在线不卡 | 久久久91精品国产一区二区三区 | 先锋av资源在线 | 欧美日韩精品一区二区三区蜜桃 | 黄色小视频在线免费观看 | 日韩中文字幕在线观看 | 欧美成人免费在线视频 | 午夜www | av在线一区二区三区 | 国产激情在线 | 精品国产黄a∨片高清在线 天天色天天色 | 国产人成精品一区二区三 | 操操操av| 久久这里有精品视频 | 黄色一区二区三区 | 亚洲aaa| 欧美精品一二三区 | 国产精品欧美一区二区三区不卡 | 久久99精品久久久久久园产越南 | 国产日韩精品一区二区 | 在线看av的网址 | 久久99精品久久久久久6194 |