背景
在使用idea的時(shí)候蹈胡,idea會(huì)給出一些優(yōu)化建議,例如:
點(diǎn)開后朋蔫,會(huì)變成原本的語句:
為啥這兩句話會(huì)等價(jià)呢罚渐,于是就研究研究了這個(gè)lambda表達(dá)式的一些基本的概念
概念
首先呢,lambda表達(dá)式使用要求jdk≥1.8驯妄。
lambda表達(dá)式是匿名方法荷并,它提供了輕量級(jí)的語法,從而解決了匿名內(nèi)部類帶來的“高度問題”青扔。
由參數(shù)列表源织、箭頭符號(hào)->和函數(shù)體組成翩伪。函數(shù)體既可以是一個(gè)表達(dá)式,也可以是一個(gè)語句塊谈息。
例如:
() -> System.out.println("線程建立")
( x, y ) -> x + y
能干什么用呢缘屹,我的理解是,從效果上看侠仇,基本上等價(jià)于返回一個(gè)接口類轻姿,這個(gè)接口類只能有一個(gè)方法,方法的參數(shù)列表就是->前面的參數(shù)列表傅瞻,后面就是這個(gè)方法的函數(shù)體踢代。
例如,比較常見的創(chuàng)建一個(gè)線程并啟動(dòng)嗅骄,一般是這么寫:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程建立");
}
}).start();
這里Thread構(gòu)造函數(shù)需要傳遞一個(gè)Runnable接口類胳挎,Runnable接口類實(shí)際上就有一個(gè)唯一的方法,就是run溺森。所以Runnable這個(gè)匿名類就可以改寫為lambda表達(dá)式方法:
new Thread(() -> {
System.out.println("線程建立");
}).start();
另外還有個(gè)特性慕爬,如果方法塊中只有一句話,可以把大括號(hào)和分號(hào)去掉
new Thread(() -> System.out.println("線程建立")).start();
于是我們就把上面六行代碼縮減成一行了屏积。很酷炫有沒有医窿。
進(jìn)階
簡(jiǎn)單介紹完后,下面先簡(jiǎn)單介紹下其他有用的點(diǎn):
在JDK1.8中炊林,List等集合類適配了一些配合lambda表達(dá)式的方法姥卢,比如forEach等,配合lambda表達(dá)式可以方便的進(jìn)行一些遍歷等操作
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 101; i++) {
list.add(i);
}
list.forEach(s -> System.out.println(s));
forEach定義在Iterable接口中
可以看到渣聚,有個(gè)accept方法(default關(guān)鍵字是JDK1.8特性独榴,可以給接口添加默認(rèn)方法,類似抽象類奕枝,這個(gè)以后再說棺榔,先不考慮default關(guān)鍵字標(biāo)注的方法),
Consumer接口隘道,只有一個(gè)方法症歇,所以當(dāng)我們調(diào)用list.forEach(s -> System.out.println(s));也就是相當(dāng)于實(shí)現(xiàn)了一個(gè)匿名類,類實(shí)現(xiàn)了Consumer接口谭梗,類似下面的代碼:
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer s) {
System.out.println(s);
}
});
實(shí)際上發(fā)現(xiàn)忘晤,如果在方法中使用lambda表達(dá)式,需要參數(shù)的接口類默辨,是函數(shù)式接口德频,通俗講就是函數(shù)式接口(Functional Interface)就是一個(gè)具有一個(gè)方法的普通接口。
像
- java.lang.Runnable
- java.util.concurrent.Callable
- java.util.Comparator
- java.io.FileFilter
還有很多缩幸,jdk也增加了許多壹置,可以參考Java 8 函數(shù)式接口竞思。
回到本文開頭,也就不難看出為啥這兩個(gè)等價(jià)了
因?yàn)镽owMapper只有一個(gè)方法钞护,mapRow盖喷,所以也就可以看作為一個(gè)函數(shù)式接口,那么就可以用lambda表達(dá)式進(jìn)行編寫了难咕,(result, i)->{...}
课梳。
其他
lambda如果配合1.8新增的集合類的Stream,還可以更方便的處理集合類的需求余佃,這個(gè)有機(jī)會(huì)再分享吧暮刃。
本人由于研究使用lambda表達(dá)式時(shí)間也不太長(zhǎng),如果有錯(cuò)誤還希望指出來爆土,共同進(jìn)步哈~