lambda java_Java Lambdas简介
lambda java
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) // => 9filter的參數是對我使用的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的內容還有很多要寫的,但這是另一篇文章。
翻譯自: https://www.javacodegeeks.com/2013/10/introduction-to-java-lambdas.html
lambda java
總結
以上是生活随笔為你收集整理的lambda java_Java Lambdas简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑椅报价(电脑桌椅子价格及图片)
- 下一篇: 悄悄关注怎么设置(悄悄关注怎么设置手机)