java代碼lambda java代碼怎么運(yùn)行

Java8和Scala中的Lambda表達(dá)式

;?? Java 終于要支持Lambda表達(dá)式!自 年以來Lambda表達(dá)式已經(jīng)在Lambda項(xiàng)目中被支持 在那時(shí)候 Lambda表達(dá)式仍被稱為Java閉包 在我們進(jìn)入一些代碼示例以前 先來解釋下為什么Lambda表達(dá)式在Java程序員中廣受歡迎 ??? ??? 為什么使用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á)式所能解決的其中一類問題 ??? ??? Lambda表達(dá)式代替函數(shù)??? ??? 一個(gè)lambda表達(dá)式從字面上講就是一個(gè)函數(shù) 它定義了一個(gè)函數(shù)的輸入?yún)?shù)和函數(shù)體 Java 中的 lambda表達(dá)式語法尚未確定 不過大致應(yīng)該類似這個(gè)樣子的 ??? ??? (type parameter) function_body 一個(gè)具體的例子 ??? ??? (String s String s ) s length() s length() ??? ??? 這個(gè)lambda表達(dá)式用來計(jì)算兩個(gè)字符串的長度差 還有一些擴(kuò)展的語法 比如避免參數(shù)的類型定義(我們馬上見看到例子)還有使用{和}來支持多行定義 ??? ??? Collections sort()??? ??? 方法是lambda表達(dá)的理想例子 它允許我們將字符串按照長度排序 ??? ??? ListString list = Array asList( loooooong short tiny ) ??? ??? Collections sort(list (String s String s ) s length() s length()) ??? ??? tiny short loooooong ??? ??? 所以 不像現(xiàn)在java必須要求的向sort方法輸入一個(gè)已經(jīng)實(shí)現(xiàn)的Comparator(比較器)而是傳送一個(gè)lambda表達(dá)式我們就可以得到相同的結(jié)果 ??? ??? Lambda表達(dá)式代替閉包??? ??? lambda表達(dá)式有許多有趣的特性 其中之一是 它們是閉包 一個(gè)閉包允許函數(shù)訪問直接詞法作用域之外的變量 ??? ??? String outer = java (String s ) s length() outer length()??? ??? 在例子中 lambda表達(dá)式訪問了字符串 outer 這個(gè)作用域之外定義的變量 對(duì)于內(nèi)聯(lián)閉包來說這是很難做到的 ??? ??? Lambda表達(dá)式也支持類型推論??? ??? 類型推論是java 引入的但它同樣適用于lambda表達(dá)式 簡單來說 類型推論意味著程序員可以在任意一個(gè)編譯器能夠自動(dòng)推斷出類型的地方省略類型定義 如果類型推論能夠應(yīng)用到前面的排序lambda表達(dá)式上 那么它就能寫成下面的樣子 ??? ??? ListString list = Arrays asList(…) ??? ??? Collections sort(list (s s ) s length() s length()) ??? ??? 就像你所見到的一樣 參數(shù)s 和s 的類型被省略了 因?yàn)榫幾g器知道list是一個(gè)字符串集合 它知道被用來作為比較器的lambda表達(dá)式必定是相同的類型 因此 這個(gè)類型不需要顯式地聲明 即使你有這么做的自由 ??? ??? 類型推論的主要優(yōu)勢(shì)就是減少樣板代碼 如果編譯器可以為我們識(shí)別類型 為什么我們必須自己定義它們 ??? ??? 珍愛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)勢(shì)之前 先來看看在Scala中的lambda表達(dá)式副本 ??? ??? 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中寫作如下 ??? ??? (s : String s :String) = s length s ??? ??? length Scala中的函數(shù)文本也是閉包 它可以訪問在直接詞法作用域之外定義的變量 ??? ??? val outer = val myFuncLiteral = (y: Int) = y * outer? val result = myFuncLiteral( )? 這個(gè)例子結(jié)果是 ??? ??? 正如你所見 我們將函數(shù)文本分配給了變量 myFuncLiteral ??? ??? java 的lambda表達(dá)式和Scala的函數(shù)文本在語法和語義上的相似性是十分明顯的 從語義上講它們是相同的 而語法上的唯一不同就是箭頭符號(hào)(java scala =)和我們沒有提到的簡化符號(hào) lishixinzhi/Article/program/Java/hx/201311/27132

慶陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

java lambda

java的lambda表達(dá)式是什么?下面就一起來了解一下吧~

Lambda 表達(dá)式被熟稱為:閉包,是推動(dòng) Java 8 發(fā)布的一個(gè)新特性,使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊。

語法

lambda 表達(dá)式的語法格式如下:

(parameters)?-?expression或(parameters)?-{?statements;?}以下是lambda表達(dá)式的重要特征:

可選類型聲明:不需要聲明參數(shù)類型,編譯器可以統(tǒng)一識(shí)別參數(shù)值。

可選的參數(shù)圓括號(hào):一個(gè)參數(shù)無需定義圓括號(hào),但多個(gè)參數(shù)需要定義圓括號(hào)。

可選的大括號(hào):如果主體包含了一個(gè)語句,就不需要使用大括號(hào)。

可選的返回關(guān)鍵字:如果主體只有一個(gè)表達(dá)式返回值則編譯器會(huì)自動(dòng)返回值,大括號(hào)需要指定表達(dá)式返回了一個(gè)數(shù)值。

Lambda 表達(dá)式實(shí)例

Lambda?表達(dá)式的簡單例子: //?1.?不需要參數(shù),返回值為?5??()?-?5?? ??//?2.?接收一個(gè)參數(shù)(數(shù)字類型),返回其2倍的值??x?-?2?*?x?? ?? //?3.?接受2個(gè)參數(shù)(數(shù)字),并返回他們的差值??(x,?y)?-?x?–?y?? ?? //?4.?接收2個(gè)int型整數(shù),返回他們的和??(int?x,?int?y)?-?x?+?y?? ?? //?5.?接受一個(gè)?string?對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來像是返回void)??(String?s)?-?System.out.print(s)

在 Java8Tester.java 文件輸入以下代碼:

Java8Tester.java?文件 public?class?Java8Tester?{ ???public?static?void?main(String?args[]){ ??????Java8Tester?tester?=?new?Java8Tester();???????? ??????//?類型聲明 ??????MathOperation?addition?=?(int?a,?int?b)?-?a?+?b;???????? ??????//?不用類型聲明 ??????MathOperation?subtraction?=?(a,?b)?-?a?-?b;???????? ??????//?大括號(hào)中的返回語句 ??????MathOperation?multiplication?=?(int?a,?int?b)?-?{?return?a?*?b;?};???????? ??????//?沒有大括號(hào)及返回語句 ??????MathOperation?division?=?(int?a,?int?b)?-?a?/?b;???????? ??????System.out.println("10?+?5?=?"?+?tester.operate(10,?5,?addition));??????System.out.println("10?-?5?=?"?+?tester.operate(10,?5,?subtraction));??????System.out.println("10?x?5?=?"?+?tester.operate(10,?5,?multiplication));??????System.out.println("10?/?5?=?"?+?tester.operate(10,?5,?division));???????? ??????//?不用括號(hào) ??????GreetingService?greetService1?=?message?-??????System.out.println("Hello?"?+?message);???????? ??????//?用括號(hào) ??????GreetingService?greetService2?=?(message)?-??????System.out.println("Hello?"?+?message);???????? ??????greetService1.sayMessage("Runoob");??????greetService2.sayMessage("Google");???} ???? ???interface?MathOperation?{ ??????int?operation(int?a,?int?b);???} ???? ???interface?GreetingService?{ ??????void?sayMessage(String?message);???} ???? ???private?int?operate(int?a,?int?b,?MathOperation?mathOperation){ ??????return?mathOperation.operation(a,?b);???}}

執(zhí)行以上腳本,輸出結(jié)果為:

$?javac?Java8Tester.java $?java?Java8Tester10?+?5?=?1510?-?5?=?510?x?5?=?5010?/?5?=?2Hello?RunoobHello?Google

使用 Lambda 表達(dá)式需要注意以下兩點(diǎn):

Lambda 表達(dá)式主要用來定義行內(nèi)執(zhí)行的方法類型接口,例如,一個(gè)簡單方法接口。在上面例子中,我們使用各種類型的Lambda表達(dá)式來定義MathOperation接口的方法。然后我們定義了sayMessage的執(zhí)行。

Lambda 表達(dá)式免去了使用匿名方法的麻煩,并且給予Java簡單但是強(qiáng)大的函數(shù)化的編程能力。

java lambda表達(dá)式是什么?

lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持JAVA也能進(jìn)行簡單的“函數(shù)式編程”。它是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象(lambda abstraction),是一個(gè)匿名函數(shù),即沒有函數(shù)名的函數(shù)。

函數(shù)式接口:

這個(gè)是理解Lambda表達(dá)式的重點(diǎn),也是產(chǎn)生lambda表達(dá)式的“母體”,這里我們引用一個(gè)比較容易理解的說法:函數(shù)式接口是 一個(gè)只有一個(gè)抽象方法(不包含object中的方法)的接口。

這個(gè)需要說明一點(diǎn),就是在Java中任何一個(gè)對(duì)象都來自O(shè)bject 所有接口中自然會(huì)繼承自O(shè)bject中的方法,但在判斷是否是函數(shù)式接口的時(shí)候要排除Object中的方法。

文章題目:java代碼lambda java代碼怎么運(yùn)行
分享路徑:http://bm7419.com/article8/dohphip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航營銷型網(wǎng)站建設(shè)移動(dòng)網(wǎng)站建設(shè)、Google、App設(shè)計(jì)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營