黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java中什么是lambda表達式

Java中什么是lambda表達式

更新時間:2019-12-10 15:38:44 來源:動力節點 瀏覽3199次

Lambda表達式

  經常聽到一個概念:閉包。閉包就是能夠讀取其他函數內部變量的函數。例如在javascript中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義在一個函數內部的函數“。在本質上,閉包是將函數內部和函數外部連接起來的橋梁。

Java中什么是lambda表達式.jpg

  其實,就是Lambda表達式,Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。

  出現原因

  面向對象式編程就應該純粹的面向對象,于是經常看到這樣的寫法: 如果你想寫一個方法,那么就必須把它放到一個類里面,然后new出來對象,對象調用這個方法。最大的問題就在于其冗余的語法,有人戲稱匿名類型導致了“高度問題”(height problem): 大多匿名內部類的多行代碼中僅有一行在做實際工作。因此JAVA8中就提供了這種“函數式編程”的方法 —— lambda表達式,供我們來更加簡明扼要的實現內部匿名類的功能。

  也就是說,你在某處就真的只需要一個能做一件事情的函數而已,連它叫什么名字都無關緊要。 Lambda 表達式就可以用來做這件事。

  語法介紹

  函數式接口

  函數式接口(Functional Interface):定義的一個接口,接口里面必須 有且只有一個抽象方法(可以有默認方法和靜態方法) ,這樣的接口就成為函數式接口。在可以使用lambda表達式的地方,方法聲明時必須包含一個函數式的接口。

  如果我們提供的這個接口包含一個以上的Abstract Method,那么使用lambda表達式則會報錯。 因為這不是函數式接口。

  例如:

       Java中什么是lambda表達式.png

  Java 8為函數式接口引入了一個新注解@FunctionalInterface,主要用于編譯級錯誤檢查,加上該注解,當你寫的接口不符合函數式接口定義的時候,編譯器會報錯。你不加的話,就不做檢查。

  注意點:

  函數式接口中可以額外定義多個Object的public方法一樣抽象方法:接口最終有確定的類實現, 而類的最終父類是Object。 因此函數式接口可以定義Object的public方法。

  函數式接口的抽象方法可以聲明 可檢查異常(checked exception)。 在調用目標對象的這個方法時必須catch這個異常。

  函數式接口中除了那個抽象方法外還可以包含靜態方法、默認方法。

  任何函數式接口都可以使用lambda表達式替換。 例如系統已經有的:ActionListener、Comparator、Runnable。JDK 8之前已有的函數式接口:

       Java中什么是lambda表達式.png

  另外,還有好多好多的接口,可以到具體的java.util.function包下去看一下。

  那么在參數為這些接口的地方,我們就可以直接使用lambda表達式了!

  Lambda表達式

       Java中什么是lambda表達式.png

  當lambda表達式的參數個數只有一個,可以省略小括號;

  當lambda表達式只包含一條語句時,可以省略大括號、return和語句結尾的分號。自動返回該語句的結果。

  Lambda 表達式的簡單例子: 

  Java中什么是lambda表達式.png

  特性與注意點

  lambda表達式中的this概念

  在lambda中,this不是指向lambda表達式產生的那個SAM對象,而是聲明它的外部對象。

  不舉例子了,是真的。

  類型推導

  先上個小例子舉例:

       Java中什么是lambda表達式.png

  編譯器負責推導lambda表達式的類型。它利用lambda表達式所在上下文所期待的類型進行推導, 這個被期待的類型被稱為目標類型。就是說我們傳入的參數可以無需寫類型了!

  因此,在定義函數時:

  MathOperation addition = (a, b) -> a + b;

  我們并沒有在入參里說明入參a,b的類型,因為如果沒有類型推導,得這么寫:

  (int a, int b) -> a + b;

  2.3.3 函數嵌套

  我們知道,系統已經幫我們創建了幾個函數時接口,例如:

       Java中什么是lambda表達式.png

  它的代碼如下:

    Java中什么是lambda表達式.png

  它內置了兩個寫出了默認實現的方法,基于它們,可以實現函數的嵌套。

       Java中什么是lambda表達式.png

  首先,這是一個函數式接口,真正的抽象函數只有一個。

  接下來我們看一下,compose() 和 andThen() 這兩個默認實現為什么能夠實現級聯操作:首先我們定義了兩個,分別是fun1和fun2。那,對于fun1.apply("a")操作,我們就是將“a”作為參數,傳給函數fun1,然后fun1把它執行掉,故輸出“a>”。

  我們著重要分析的是fun1.compose(fun2).apply("b")。分析compose函數,before=fun2。因此,(V v) -> apply(before.apply(v))最終變為:(V v) -> apply(fun2.apply(v)),即為:fun1.apply(fun2.apply(v)),因此是v先給fun2處理,得到“b+”;然后“b+”傳給fun1,得到“b+>”。因此,實現了兩個函數的嵌套。

  同理,fun1.andThen(fun2).apply("c"),after=fun2,因此(T t) -> after.apply(apply(t));即為:fun2.apply(apply(t))。apply(t)是針對于fun1的,因此是fun1處理完完后又fun2處理。

  不過,這兩個方法是系統內置的,會用就可以了。

  3 總結

  Java8 提供的Lambda表達式使得Java程序更為便捷、靈活,不過在使用Lambda表達式時也要注意相關指向問題,防止迷失。

  關于Java8中Lambda表達式的介紹就到這里,在后續的文章中我們將介紹Java8中的其它特性。

Java中什么是lambda表達式.jpg

      以上就是動力節點Java培訓機構小編介紹的“Java中什么是lambda表達式”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 97色伦图片在线观看 | 免费大黄| 欧美日韩一本二本 | 密私密影院在线观看 | 日日摸日日碰夜夜97 | 国产乱人免费视频 | 男人把女人下面桶爽的视频 | 欧美性高清video| 国产欧美日韩在线视频 | 浪浪视频成版人在线观看 | 影音先锋日韩 | 色黄啪啪18周岁以下禁止观看 | 国产网站免费看 | 五月婷婷精品 | 中文字幕一区二区三区5566 | 亚洲精品视频在线观看免费 | 国产精品视频久 | 日韩欧美在线视频 | 日本一道本高清免费 | 欧美日韩一 | 中文字幕亚洲综合久久202 | 91精品国产肉丝高跟在线 | 日一级片| 性xxx欧美 | 国产一级久久久久久毛片 | 午夜剧场伦理 | 免费成人激情视频 | 精品久久久久久中文字幕一区 | 欧美丝袜nylons丝交 | 午夜剧场免费体验 | 日韩欧美网址 | 在线成人免费观看国产精品 | 国产精品成人h视频 | 成人速播影院在线播放免费 | 亚洲在成人网在线看 | 免费看片黄 | 成人性a激情免费视频 | 甜性涩爱免费在线观看 | 性欧美xxx在线观看 性欧美疯狂猛交69hd | 欧美色网络 | 黄页视频免费 |