??Java8帶來了一系列令人耳目一新的語言特性,其中最重要的就是接受了函數(shù)式編程的風(fēng)格。Lambda表達(dá)式、接口的演變、庫的重構(gòu)、支持流數(shù)據(jù)處理、新的并行處理等新概念是其中最大的變化。
??在具體介紹這些概念之前,我們先用一些簡單的例子來看看到底什么是Lambda表達(dá)式。
1、Runnable例子
??我們先用傳統(tǒng)的方式來創(chuàng)建一個(gè)Runnable實(shí)例以及一個(gè)運(yùn)行該接口的線程。
Runnable oldRunnable = new Runnable() {
@Override
public void run() {
System.out.println("do something");
doSomething();
}
};
??啟用線程執(zhí)行該接口:
new Thread(oldRunnable).start();
??從上面的代碼可以看出,為了實(shí)現(xiàn)我們想要的邏輯,我們必須先實(shí)現(xiàn)這個(gè)Runnable接口,把相關(guān)代碼封裝在run方法里面,然后再創(chuàng)建一個(gè)線程去啟動(dòng)接口的執(zhí)行。
2 、匿名類
??另一種方式是使用匿名類。這兒我們不必去實(shí)例化Runnable接口而是直接使用內(nèi)聯(lián)的匿名類。
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("do something");
doSomething();
}
}).start();
??比較這兩種寫法,我們可以看出,匿名類相對第一種寫法僅僅是減少了變量的定義,整個(gè)邏輯其實(shí)并沒有區(qū)別,我們真正想要執(zhí)行的doSomething()仍然是隱晦的,被其他多余的代碼所干擾。
3、使用Lambda表達(dá)式
??我們先不說關(guān)于Lambda表達(dá)式太多的細(xì)節(jié),而是先看下上面的邏輯如何使用Lambda來替換。
// 創(chuàng)建Lambda表達(dá)式
Runnable doSomethingLambda = () -> doSomething();
// 創(chuàng)建線程執(zhí)行
new Thread(doSomethingLambda).start();
??我們創(chuàng)建了第一個(gè)Lambda表達(dá)式直接調(diào)用我們想要執(zhí)行的方法,把這個(gè)表達(dá)式賦值給Runnable變量,然后把這個(gè)變量作為Thread的入?yún)ⅰ_@樣代碼不僅清晰而且簡潔,直接體現(xiàn)了想要執(zhí)行的邏輯意圖,省去了其他的干擾。
??另一種寫法:
new Thread(() -> {
System.out.println("do something");
doSomething();
}).start();
??我們可以看到Thread直接收到一段代碼作為入?yún)?,而不需要?jiǎng)?chuàng)建Runnable變量。
??現(xiàn)在如果你想要做另一件事情,你可以很容易地實(shí)現(xiàn):
new Thread(() -> doOtherThing()).start();
??這種我們傳遞代碼像以前傳遞數(shù)據(jù)一樣的使用方式,在Java8之前是不支持的。