Java 8——Lambda運算式

來源:互聯網
上載者:User

標籤:exp   lint   index   tor   抽象方法   tutorial   lang   結果   體系   

本篇文章不介紹Lambda的前世今生,這裡只對Lambda表達的應用做詳細瞭解。以及與內部類的差異點。

Lambda運算式

Lambda運算式是Java SE 8版本中引入的新的文法糖。將功能看做方法參數,將代碼看做資料。

Lambda運算式文法:

LambdaParameters -> LambdaBody

Lambda運算式分為三部分:

  • 參數列表
  • ->符號
  • 函數體

如:

() -> {} // 無參,返回結果為空白(x) -> System.out.println(x); // 帶有一個參數(Thread t) -> { t.start(); }  // 帶有一個申明參數(int x, int y) -> x + y; // 帶有兩個申明參數,一個方法參數;(int x, int y) -> return x +y; // 帶有兩個申明參數,一個方法參數;(x, y) -> return x +y; // 帶有兩個申明參數,一個方法參數;

總體上表現如上形式,是Java中一種新的風格的運算式,和普通的表達的確有很大風格上的差異性。

這種風格的文法優勢:

  • 文法特點決定了語句的簡潔緊湊,通過減少申明類型、return、單行語句去括弧等等從而變得更精簡;

  • 具有更強的表達能力,減少冗餘的代碼,從而更關注真正的功能語句,語義更精確清晰;

函數式介面

已經對lambda運算式定義好了,但是如何在相容物件導向的Java體系中使用。在物件導向體系中,一切皆是對象,怎樣將這種運算式作為對象去使用,從而引入函數使介面:只有一個抽象方法的介面,代表著單功能的契約

為了區分函數式介面和只包含一個抽象方法的普通介面,需要使用@FunctionalInterface註解標註介面,這樣編譯器就能將其作為函數式介面處理。

有了函數式介面就可以很方便的使用lambda運算式,使用Java來進行函數式編程。

Function<String, String> f = (String x) -> x.toUpperCase();f.apply("msg");

lambda運算式可以賦值給函數式介面,這裡涉及到目標類型上下文,編譯器根據lambda運算式所在的上下文推導其目標類型為Function。

List<String> list = new ArrayList<>();list.forEach((x) -> System.out.println(x));

lambda運算式作為方法參數,其實是list.forEach方法中的方法參數是函數式介面,編譯器推導lambda運算式類型為forEach中的函數式介面類型作為lambda運算式的目標類型。

從以上可以看出:

  • lambda運算式的目標類型必須是函數式介面,但是函數式介面和lambda運算式是兩部分,函數式介面並不屬於lambda運算式一部分,只是作為其目標類型;

  • 函數式介面的抽象方法參數必須與lambda運算式的相一致:數量和個數;

  • 函數式介面抽象方法返回參數與lambda運算式傳回值一致:類型;

  • lambda運算式中拋出的受檢異常與函數式介面抽象方法上的throws保持一致;

函數式介面使得lambda運算式能夠更好的使用。Java是物件導向,如果在此基礎上引入lambda,勢必需要向前相容:

  • 如果引入新的類型,勢必要與舊的api形成兩套體系,這樣就無法在曆史版本中使用lambda運算式;

  • 如果引入新的類型,Java類庫需要對於同一功能就需要維護兩份:過去曆史版本/lambda版本;

如果使用已有的介面表示:

  • 介面是 Java 類型系統的一部分

  • 介面天然就擁有其運行時表示(Runtime representation);

基於這些原因,選擇已有的介面類型作為函數式介面,然後引入lambda運算式是最折中平衡的方式。

Lambda運算式與匿名內部類
  1. lambda運算式的簡潔、緊湊的文法結構是匿名內部類所不能比擬的;

  2. lambda運算式具有更明確的語義——因為只關注有效代碼;

  3. lambda運算式的範圍比匿名內部類更加有友好(詞法範圍/新的內部範圍):this在lambda運算式中表示外部內,而在內部類中表示當前內部類執行個體;變數名在lambda運算式中就是表示外部的,而在內部類中要防止繼承自超類———lambda的詞法範圍;(shadow問題)

  4. lambda是函數式編程的體現,內部類任然是在物件導向層面;

參考

深入理解Java 8 Lambda(語言篇——lambda,方法引用,目標類型和預設方法)

The Java? Language Specification

Lambda Expressions

Java 8——Lambda運算式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.