天天看點

JDK8特性之lambda表達式淺識序語

序語

一直在用JDK8,但是為什麼要用JDK8呢,和jdk1.7的差別又在哪裡,以前從來沒認真思考過這些個問題,偶然間見到這樣一段代碼:

new Thread( () -> {
	……;
}) ).start();
           

發現自己完全屬于懵逼狀态,于是開始新的征程。學習是件快樂的事情,特别是當你發現之前一直不了解的某個事情,忽然茅塞頓開,了解了,其實也就那樣,但是心中卻是滿滿的滿足感。

lambda表達式淺識

“Lambda 表達式”(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(注意和數學傳統意義上的不同)。

以上一段話來自百度百科,然而對于我來說,這就是一堆的天書,是以我到在很多大牛的部落格中找到了挺多相關的解釋,自己整理了一下,在此談談個人簡單的了解。至于借鑒了哪些人的文章,這裡就不一一去回顧了,看了太多了,之前一直不了解,也不知道怎麼去用,永遠隻有一個用法:

new Thread( () -> {

……;

}) ).start();

今天忽然了解了。。原來就是這麼一回事。

首先我們也從上面這段代碼開始了解,首先看new thread().start(),原本括号中應該是:

new Runable(){

public void run() {

}

}

然後在run方法中添加具體的邏輯代碼,但是,在lambda表達式中,以上一串代碼被以下代碼代替了:

() ->{}

首先看到這個括号,其實我的了解這個括号就是代表着run方法,如果說接口中的方法需要帶參數,就在括号中添加相應的參數名稱,參數不需要添加類型。如:

interface Test {

void test(String str);

}

在main方法中可以這樣調用:

Test test = (str)-> {System.out.println(str)};

當抽象方法隻有一個參數時,小括号還可以省略,如:

Test test = str-> {System.out.println(str)}; //學習了

函數體隻有一條語句時,還可以這樣:

Test test = str-> System.out.println(str);

寫到這裡,我又悟了上面百度百科解釋上的一個詞了:匿名函數,其實我更傾向于匿名類的解釋,應該說(str)-> {System.out.println(str)}; 這句代碼就是一個實作Test接口的匿名類。而花括号中的函數體就是匿名函數了。

lambda表達式使用注意事項

1、 使用Lambda表達式必須要有接口,并且要求接口中有且僅有一個抽象方法。

如:

interface Test {
	void test1(String str);
	void test2();
}
           

該接口有兩個抽象方法,無法使用lambda表達式。

2、Lambda表達式無類型,不能執行 ‘.’ 運算。

Test test = ((str)-> {System.out.println(str)}).toString();//這是錯誤的,編譯器都不會讓你通過。

總結

活到老學到老,在程式設計過程中,要對每一個用到的架構、每一個類甚至每一條語句都抱着學習的态度去對待,不要像我之前的狀态,用着JDK8卻不知道是以然用它。有多少朋友是和我一樣的呢,想必應該也不少吧,希望看到這篇文章,能重新認識自己,重新認識程式設計。共勉。

繼續閱讀