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

歡迎訪問 生活随笔!

生活随笔

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

java

Java Lambdas简介

發布時間:2023/12/3 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Lambdas简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java 8的主題是lambdas。 我已經注意到,對于許多Java程序員來說,lambda都是非常難的材料。 因此,讓我們嘗試對它們有一個基本的了解。

首先,lambda到底是什么? Lambda是一個匿名函數,與常規函數不同,它沒有綁定到標識符(即,它沒有名稱)。 這些函數可以作為參數傳遞給其他函數(稱為高階函數)。

假設我們的應用程序必須從系統的不同位置寫入一堆文件。 我們不想每次都處理已檢查的異常[請參閱“ 例外:已檢查和未檢查”以獲取有關已檢查的異常的更多信息]。 因此,我們決定編寫一個低級的writeToFile函數,該函數將打開FileWriter并將其傳遞給可以安全地寫入文件的函數。

使用此低級函數,我們編寫以下代碼。

writeToFile("todo.txt", new FileWriteFunction() {@Overridepublic void apply(Writer file) throws IOException {file.write("learn about lambdas\n");file.write("learn stream API\n");} })

我們傳遞給writeToFile的對象是FileWriteFunction的匿名實現[是匿名的,因為我們沒有將其命名為類]。 它具有單個功能,因此可以有效地傳遞匿名功能。 在Java的世界中,這些有時稱為回調 。 可能您以前至少使用過幾次,也許沒有引起注意。

該匿名對象實際上是lambda。 但這顯然不像傳遞函數。 語法非常笨拙。 這正是Java 8中的變化。

有了Java 8中對lambda的語法支持,代碼的讀取就像我們傳遞函數一樣。 使用Java 8 lambda,我們將上述代碼重寫如下。

writeToFile("todo.txt", file -> {file.write("learn about lambdas\n");file.write("learn stream API\n"); })

這樣更好 它強調重要的代碼,并隱藏了大部分笨拙的部分。

通常,lambda與閉包可互換使用(即詞匯功能)。 雖然它們都是匿名函數,但是閉包的定義是它是包含綁定變量的函數。 即,閉包包括一個引用表,該表包含對局部變量的引用。

例如,如果我們接受要寫入文件的參數data ,則使用閉包。

void save(String data) {writeToFile("file.db", file -> file.write(data) ); }

匿名內部類限制對最終變量的訪問,而閉包提供對任何變量的訪問。 但是,變量實際上是閉包的最終變量,因此無法將其重新分配。

那lambdas的編譯呢? Java 8是否僅使用一種方法就匿名內部類僅提供了一勺語法糖?

不是,不是 的確,它允許對任何單方法匿名內部類使用lambda語法。 但是lambda并沒有被編譯成內部類。 相反,編譯器在定義的類中輸出lambda$方法,并使用invokedynamic調度該調用。

因此,現在您知道了如何在Java 8中使用lambda。雖然lambda本身非常有用,但在將它們應用于集合時更是如此。

新的Stream API通過為集合提供功能更強大的API來提供迭代器的替代方案: java.util.stream.Stream 。 Stream上最值得注意的功能是: collect , filter , map和reduce 。

從一個簡單的例子開始,這里是如何對列表中的所有數字求和。

asList(1,2,3,4,5).stream().reduce(0, (acc, value) -> acc + value) // => 15

通過從零開始將每個值加到累加器上,可以減少序列。 為了進行比較,通常會編寫一個循環。

int acc = 0; for (int n : asList(1,2,3,4,5))acc += n; acc // => 15

繼續求和僅求奇數。 首先我們filter奇數,然后reduce 。

asList(1,2,3,4,5).stream().filter(Predicates::odd).reduce(0, (acc, n) -> acc + n) // => 9

filter的參數是我使用的Predicates類中對靜態odd函數的函數引用。 顧名思義,這是一個布爾函數,用于測試數字是否為奇數。

到目前為止,一切都很好。 現在,假設我們要將一厘米大小的列表轉換為以英寸為單位的等效大小。 我們為此使用map 。

List<Inch> inches = centimeters.stream().map(Centimeter::toInches).collect(Collectors.toList())

通過將toInches函數應用到centimeters集合中的每個項目,將centimeters映射為英寸。

從本質上講, Stream是連續的。 它用于描述要應用于集合的操作。 但是要獲得結果,必須收集數據。 這就是collect功能的目的。 它將流的元素簡化為可變容器(例如,列表)。

使用Stream API和lambda可以大大簡化用于集合的代碼,并使代碼更具表現力。 與使用破壞性操作(例如forEach )相比,首選使用非破壞性操作(例如map , filter )使代碼更易于推理。

而已! 這些是您需要了解的Java 8中的lambda(和閉包)的基礎知識。當然,關于lambda的內容還有很多要寫的,但這是另一篇文章。

參考: Software Craft博客上的JCG合作伙伴 Bart Bakker 對Java lambda的介紹 。

翻譯自: https://www.javacodegeeks.com/2013/10/introduction-to-java-lambdas.html

總結

以上是生活随笔為你收集整理的Java Lambdas简介的全部內容,希望文章能夠幫你解決所遇到的問題。

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