日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java Lambda表达式初探

發布時間:2025/4/16 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Lambda表达式初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

本文受啟發于Trisha Gee在JavaOne 2016的主題演講Refactoring to Java 8。

Java 8已經發行兩年多,但很多人仍然在使用JDK7。對企業來說,技術上謹慎未必是壞事,但對個人學習而言,不去學習新技術就很可能被技術拋棄。Java 8一個重要的變更是引入Lambda表達式(lambda expression),這聽起來似乎很牛,有種我雖然不知道Lambda表達式是什么,但我仍然覺得很厲害的感覺。不要怕,具體到語言層面上Lambda表達式不過是一種新的語法而已,有了它,Java將開啟函數式編程的大門。

為什么需要Lambda表達式

不要糾結什么是Lambda表達式、什么是函數式編程。先來看一下Java 8新的語法特性帶來的便利之處,相信你會過目不忘的。

在有Lambda表達式之前,要新建一個線程,需要這樣寫:

new Thread(new Runnable(){ @Override public void run(){ System.out.println("Thread run()"); } }).start();

有Lambda表達式之后,則可以這樣寫:

new Thread(() -> System.out.println("Thread run()") ).start();

正如你所見,之前無用的模板代碼不見了!如上所示,Lambda表達式一個常見的用法是取代(某些)匿名內部類,但Lambda表達式的作用不限于此。

Lambda表達式的原理

剛接觸Lambda表達式可能覺得它很神奇:不需要聲明類或者方法的名字,就可以直接定義函數。這看似是編譯器為匿名內部類簡寫提供的一個小把戲,但事實上并非如此,Lambda表達式實際上是通過invokedynamic指令來實現的。先別管這么多,下面是Lambda表達式幾種可能的書寫形式,“看起來”并不是很難理解。

Runnable run = () -> System.out.println("Hello World");// 1 ActionListener listener = event -> System.out.println("button clicked");// 2 Runnable multiLine = () -> {// 3 System.out.println("Hello "); System.out.println("World"); }; BinaryOperator<Long> add = (Long x, Long y) -> x + y;// 4 BinaryOperator<Long> addImplicit = (x, y) -> x + y;// 5

通過上例可以發現:

  • Lambda表達式是有類型的,賦值操作的左邊就是類型。Lambda表達式的類型實際上是對應接口的類型
  • Lambda表達式可以包含多行代碼,需要用大括號把代碼塊括起來,就像寫函數體那樣。
  • 大多數時候,Lambda表達式的參數表可以省略類型,就像代碼2和5那樣。這得益于javac的類型推導機制,編譯器可以根據上下文推導出類型信息。

表面上看起來每個Lambda表達式都是原來匿名內部類的簡寫形式,該內部類實現了某個函數接口(Functional Interface),但事實比這稍微復雜一些,這里不再展開。所謂函數接口是指內部只有一個接口函數的接口。Java是強類型語言,無論有沒有顯式指明,每個變量和對象都必須有明確的類型,沒有顯式指定的時候編譯器會嘗試確定類型。Lambda表達式的類型就是對應函數接口的類型

Lambda表達式和Stream

Lambda表達式的另一個重要用法,是和Stream一起使用。Stream is a sequence of elements supporting sequential and parallel aggregate operations。Stream就是一組元素的序列,支持對這些元素進行各種操作,而這些操作是通過Lambda表達式指定的。可以把Stream看作Java Collection的一種視圖,就像迭代器是容器的一種視圖那樣(但Stream不會修改容器中的內容)。下面例子展示了Stream的常見用法。

例子1

假設需要從一個字符串列表中選出以數字開頭的字符串并輸出,Java 7之前需要這樣寫:

List<String> list = Arrays.asList("1one", "two", "three", "4four"); for(String str : list){ if(Character.isDigit(str.charAt(0))){ System.out.println(str); } }

而Java 8就可以這樣寫:

List<String> list = Arrays.asList("1one", "two", "three", "4four"); list.stream()// 1.得到容器的Steam .filter(str -> Character.isDigit(str.charAt(0)))// 2.選出以數字開頭的字符串 .forEach(str -> System.out.println(str));// 3.輸出字符串

上述代碼首先1. 調用List.stream()方法得到容器的Stream,2. 然后調用filter()方法過濾出以數字開頭的字符串,3. 最后調用forEach()方法輸出結果。

使用Stream有兩個明顯的好處:

  • 減少了模板代碼,只用Lambda表達式指明所需操作,代碼語義更加明確、便于閱讀。
  • 將外部迭代改成了Stream的內部迭代,方便了JVM本身對迭代過程做優化(比如可以并行迭代)。
  • 例子2

    假設需要從一個字符串列表中,選出所有不以數字開頭的字符串,將其轉換成大寫形式,并把結果放到新的集合當中。Java 8書寫的代碼如下:

    List<String> list = Arrays.asList("1one", "two", "three", "4four"); Set<String> newList = list.stream()// 1.得到容器的Stream .filter(str -> !Character.isDigit(str.charAt(0)))// 2.選出不以數字開頭的字符串 .map(String::toUpperCase)// 3.轉換成大寫形式 .collect(Collectors.toSet());// 4.生成結果集

    上述代碼首先1. 調用List.stream()方法得到容器的Stream,2. 然后調用filter()方法選出不以數字開頭的字符串,3. 之后調用map()方法將字符串轉換成大寫形式,4. 最后調用collect()方法將結果轉換成Set。這個例子還向我們展示了方法引用(method references,代碼中標號3處)以及收集器(Collector,代碼中標號4處)的用法,這里不再展開說明。

    通過這個例子我們看到了Stream鏈式操作,即多個操作可以連成一串。不用擔心這會導致對容器的多次迭代,因為不是每個Stream的操作都會立即執行。Stream的操作分成兩類,一類是中間操作(intermediate operations),另一類是結束操作(terminal operation),只有結束操作才會導致真正的代碼執行,中間操作只會做一些標記,表示需要對Stream進行某種操作。這意味著可以在Stream上通過關聯多種操作,但最終只需要一次迭代。如果你熟悉Spark RDD,對此應該并不陌生。

    結語

    Java 8引入Lambda表達式,從此打開了函數式編程的大門。如果你之前不了解函數式編程,不必糾結于這個概念。編程過程中簡潔明了的書寫形式以及強大的Stream API會讓你很快熟悉Lambda表達式的。

    本文只對Java Lambda表達式的基本介紹,希望能夠激發讀者對Java函數式編程的興趣。如果本文能夠讓你覺得Lambda表達式很好玩,函數式編程很有趣,并產生了進一步學習的欲望,那就再好不過了。文末參考文獻中列出了一些有用的資源。

    ?

    參考文獻

    http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html
    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
    https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
    http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html
    http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html
    http://www.slideshare.net/trishagee/refactoring-to-java-8-devoxx-uk
    《Java 8函數式編程 [英]沃伯頓》
    https://www.oracle.com/javaone/speakers.html#gee

    總結

    以上是生活随笔為你收集整理的Java Lambda表达式初探的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天堂在线中文 | 国产伦精品一区二区三区视频免费 | 欧美,日韩,国产精品免费观看 | 在线观看xxxx| av黄色在线播放 | a级无遮挡超级高清-在线观看 | 国产在线精品成人欧美 | 国产婷婷久久 | 国产调教 | 国产激情自拍 | 黄色一级网 | 欧美成人h版 | 日韩福利电影在线观看 | 国产成年妇视频 | 精品无码m3u8在线观看 | 一区久久| 国精产品一区一区三区mba下载 | 成年人的免费视频 | 国产精品三级电影 | 在线观看亚洲一区二区 | 国产日b视频 | 精品人妻久久久久久888不卡 | 国产乱码一区二区三区播放 | 97蜜桃网| 亚洲欧洲久久 | 成人羞羞国产免费 | 成人欧美一区二区三区在线观看 | 国产日本精品 | 国产高清视频在线 | 久久精品9| 少妇一级淫片免费观看 | 中文字幕无码日韩专区免费 | 两个人看的www视频免费完整版 | 成人一级黄色片 | 美女福利视频网 | 黑人超碰 | 99热这里只| av毛片一区 | 国产精品久久久精品三级 | 波多野结衣中文字幕在线播放 | 91精品国产高清一区二区三区蜜臀 | 日韩性欧美 | 国精品人妻无码一区二区三区喝尿 | 欧美精品一区二区三区在线播放 | 日本精品免费一区二区三区 | 中文字幕第三页 | 大桥未久在线视频 | 免费二区| www.夜夜操.com| 日本熟妇毛耸耸xxxxxx | 草草影院最新网址 | 日本欧美一区二区三区不卡视频 | 天堂色av| 欧美无马 | 女生喷液视频 | 国产专区视频 | 中文字幕一区二区人妻痴汉电车 | 久久九九视频 | 青青艹在线观看 | 日韩黄色录像 | 91涩涩涩 | 免费看a级片 | 很黄的网站在线观看 | 国产精品剧情 | 国产亚洲精品熟女国产成人 | 男人天堂久久久 | 日韩精品人妻中文字幕 | 日韩一区二区三区三四区视频在线观看 | 在线观看国产精品视频 | 精品国产乱码久久久久久鸭王1 | 日韩成人精品一区 | 丰满人妻一区二区三区免费视频棣 | 日本一级二级视频 | 亚洲精品一区二区三区四区五区 | 久久精品10| 久久国产激情 | 性视频黄色| 欧美片17c07.com | 视频一区二区在线观看 | 免费a网站 | 番号动态图 | 欧美一级无毛 | 精品一区二区三区蜜桃 | 亚洲黄在线观看 | 日日爽夜夜爽 | 女同动漫免费观看高清完整版在线观看 | 男人天堂欧美 | 第一福利在线视频 | 无码免费一区二区三区免费播放 | 国产成人一区二区三区电影 | 淫视频在线观看 | 67194国产 | 中文字幕无码人妻少妇免费 | 91丨九色丨黑人外教 | 日韩视频在线观看一区二区三区 | 欧美a级在线观看 | 嫩草网站在线观看 | 免费成人美女在线观看 | 欧美一区一区 |