大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

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

Java中什么是lambda表達式

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

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表達式”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 另类色视频 | 国产精品亚洲欧美一区麻豆 | 亚洲国产成人久久综合一区 | 黄色伊人 | 亚洲欧美日韩中文综合在线不卡 | 一本伊大人香蕉高清在线观看 | 特黄特黄一级高清免费大片 | 欧美亚洲国产另类 | 免费观看一级成人毛片软件 | 国产精品99爱免费视频 | 亚洲免费播放 | 国产成人教育视频在线观看 | 国产不卡影院 | 99在线观看免费 | 二区在线观看 | 国产欧美精品一区二区三区-老狼 | 国产成人香蕉在线视频网站 | 夜色成人影院在线www | 亚洲毛片视频 | 亚洲精品中文字幕久久久久久 | 四虎在线视频观看 | 国产成+人+综合+亚洲 欧美 | 女女女女女女bbbbbb级毛片 | 日韩美毛片 | 狠狠色噜狠狠狠狠 | 欧美成人免费高清二区三区 | 欧美日韩一级大片 | 涩色在线 | 欧美亚洲大片 | 亚洲精品欧美精品中文字幕 | 高清久久 | www.4虎影院| 欧美e片成 人 在线播放乱妇 | 欧美一级毛片aaa片 欧美一级毛片不卡免费观看 | 欧美视频久久久 | 国产成人在线视频免费观看 | 国产高清视频在线免费观看 | 99热这里只有精品国产在热久久 | 久久伊人精品综合观看99 | 国内精品51视频在线观看 | 中文字幕亚洲一区二区三区 |