日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java Lambdas简介

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

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

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

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

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

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的匿名實現(xiàn)[是匿名的,因為我們沒有將其命名為類]。 它具有單個功能,因此可以有效地傳遞匿名功能。 在Java的世界中,這些有時稱為回調(diào) 。 可能您以前至少使用過幾次,也許沒有引起注意。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

繼續(xù)求和僅求奇數(shù)。 首先我們filter奇數(shù),然后reduce 。

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

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

到目前為止,一切都很好。 現(xiàn)在,假設(shè)我們要將一厘米大小的列表轉(zhuǎn)換為以英寸為單位的等效大小。 我們?yōu)榇耸褂胢ap 。

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

通過將toInches函數(shù)應(yīng)用到centimeters集合中的每個項目,將centimeters映射為英寸。

從本質(zhì)上講, Stream是連續(xù)的。 它用于描述要應(yīng)用于集合的操作。 但是要獲得結(jié)果,必須收集數(shù)據(jù)。 這就是collect功能的目的。 它將流的元素簡化為可變?nèi)萜?#xff08;例如,列表)。

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

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

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

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。