1. 程式人生 > >Java8中的Lambda表示式

Java8中的Lambda表示式

一.簡述

Lambda表示式本是屬於JDK1.7的Lambda專案的內容.在JDK1.7開發琪琪,Sun公司由於相繼在技術競爭和商業競爭中都深陷泥潭,公司的股票市值跌至僅有高峰時期的3%,已無力推動JDK1.7的研發工作按正常進行.為了儘快結束JDK1.7長期"跳票"的問題,Oracle公司收購Sun公司後不就便宣佈將實行"Plan B","Plan B"把不能按時完成的Lambda專案,Jigsaw專案和Coin專案的部分改進延遲到JDK1.8之中(更多詳細的請見Java發展史).所以Lambda的功能才在JDK1.8中釋出.

Lambda表示式基於數學中的λ演算得名,但是和λ演算的關係又相差甚遠.有點像原子彈和質能方程的關係,差別其實還是挺大的.

什麼的Lambda表示式呢?
簡答來說Lambda表示式就是匿名方法.

匿名方法的概念類似於Anonymous類的不同之處在於它實現了一個函式式介面.
函式式介面是Java8中的新介面概念.函式式介面只能宣告一個抽象方法.
函式式介面詳細見:
Lambda表示式執行程式設計師以簡潔的方式傳遞程式碼,從而使程式碼更加的簡潔.

二. Lambda表示式語法

Lambda表示式包含:
    a.引數列表
    b.剪頭符號(->)
    c.正文的Lambda語句

Lambda表示式的語法:
    (引數)->{正文語句;}

三.Lambda表示式的使用

1.lambda表示式可以有零個或多個引數

例1:
() -> {System.out.println("Hello World");}
例2:
// 接收兩個int型的x,y,返回他們的和
(int x, int y) -> {return
x+y;}

2.如果引數的型別可以由編譯器決定,那麼我們可以忽略在lambda表示式中新增它們。

例1:
(int x, int y) -> {return x+y;} // 帶有引數型別

(x,y) -> {return x+y;}; // 忽略引數型別

3.如果只有一個引數。引數的括號可以省略

例1:
x -> {return x+10;}

String s -> System.out.println(s)

4.如果body只有一個表示式,那麼return關鍵字和大括號可以省略

(int x, int y) -> x + y
如果省略返回型別的引數,則編譯器將確定預設引數型別。

5.Lambda可以有空引數和空正文語句

例1:
() -> {return “Hello World”;} // 空引數

()->{} // 空引數以及空體

四.呼叫Lambda表示式

Lambda表示式就像一個方法一樣被呼叫和執行.
對於呼叫Lambda表示式,我們應該建立一個函式式介面.
例1:

public class MyFuntionalInterface {

    interface MyInterface{
        void hello();
    }
    public static void main(String[] args) {
        MyInterface infVar = () -> {System.out.println("Hello World");};

        infVar.hello();
    }

}

五.總結

結合函式式介面章節閱讀學習
說個題外話,看到有人說java的Lambda表示式落後C# 8年才出現,並不是java語言落後所致,而是Sun公司的衰落而至.