Lambda表達式
為什么會有Lambda表達式
要說Lambda表達式,就一定要先說一下匿名類了攻旦,像使用Thread時,要創(chuàng)建一個Runnable接口的實現(xiàn)類放入Thread的構造方法中,一般情況下都是采用內部類的形式來創(chuàng)建的
例如
Thread thread1=new Thread(new Runnable(){
@Override
public void run(){
c=1;
a=d;
}
});
這不是很亂嘛,于是就誕生了lambda表達式丈莺,lambda表達式的出現(xiàn)讓面向接口的編程更加的方便了
上面的代碼使用了lambda表達式就可以變成這樣子了
代碼
Thread thread1=new Thread(()->{
c=1;
a=d;});
這樣的代碼不是很優(yōu)美很簡介了嘛
如何使用lambda表達式
lambda的基本語法
lambda的主要構成就是一個()(參數(shù))和一個->(箭頭,所以也叫做箭頭函數(shù))送丰,還有{}(方法體)
無論有沒有參數(shù)缔俄,都要加上一個()
箭頭也是不用想了的,必須要加
方法體呢蚪战,就看情況,如果只有一行代碼铐懊,可以不加邀桑;如果超過了一行代碼,則必須要加
lambda的使用條件
lambda必須使用在所實現(xiàn)的接口只有一個方法(函數(shù)式接口)的條件下科乎,只有在只有一個方法的條件下壁畸,就能自動識別返回類型、參數(shù)茅茂、方法名捏萍。至于是什么階段進行處理的我也不是很清楚,我看.class文件中還沒有對lambda表達式進行解析空闲。
lambda的基本使用
代碼
/**
* lambda測試
* @author Administrator
*/
public class LambdaTest {
public static void main(String[] args) {
int i=10;
//2.實現(xiàn)接口
MyInterface myInterface=(a,b)->{
return (int)a+(int)b;
};
//3.使用接口
System.out.println(myInterface.method(2,9));
}
//1.先創(chuàng)建一個接口
public interface MyInterface{
Object method(Object a,Object b);
}
}
stream和lambda的結合
只有在特殊情況下令杈,我們才會考慮到使用lambda表達式,畢竟沒有那么多只有一個方法的接口碴倾。
lambda表達式最經(jīng)常的使用就是和stream結合來使用逗噩,stream是一種聲明式處理數(shù)據(jù)的方法掉丽,就是說,對于一個或一組數(shù)據(jù)异雁,能夠先定義處理方法捶障,然后在按照這個方法來處理每個數(shù)據(jù),最常見的就是forEach循環(huán)
這里列舉一些常見的stream:
forEach
map
filter
limit
不同的stream各有不用纲刀,這里就不過多地做探討了项炼,但是需要注意一點,stream不會改變原來的數(shù)據(jù)
這里想使用forEach示绊,還需要使用ArrayList锭部,所以要先轉成ArrayList才能使用
代碼
public static void main(String[] args) {
int[] i={1,2,3,4,5,7,8,9};
List list=new ArrayList();
for (int a:i) {
list.add(a);
}
list.forEach((num)->System.out.println((int)num+10););
}
結果
11
12
13
14
15
17
18
19
方法引用
方法引用的出現(xiàn)的原因
方法引用出現(xiàn)的原因跟lambda一樣,都是為了讓編程更加地方便耻台,但是它的功能卻和lambda不一樣空免,方法引用是在lambda的基礎上,讓代碼更加緊湊
如何使用方法引用
方法引用的使用方式就是::盆耽,但是需要注意的是蹋砚,方法引用引用的是已經(jīng)存在的方法,如果是要實現(xiàn)接口方法的話摄杂,還是需要使用lambda表達式
方法引用的分類
總共有四種坝咐,但是只要區(qū)分構造方法引用和其他方法引用就可以了,其他方法都是大同小異的
代碼
public static void main(String[] args) {
int[] i={1,2,3,4,5,7,8,9};
List list=new ArrayList();
for (int a:i) {
list.add(a);
}
//方法引用
list.forEach(Test::prin);
list.forEach((num)->System.out.println((int)num+10));
}
/**
* 1.先定義靜態(tài)類析恢、靜態(tài)方法
*/
public static class Test{
public static void prin(Object num){
System.out.println((int)num+10);
}
}
結果都是一樣的
需要注意的點:
方法名稱要一致(new除外)
參數(shù)個數(shù)墨坚、類型要一致
總結
lambda表達式和方法引用都是簡化了代碼,它們都有一個特點映挂,就是會延續(xù)原來方法或者接口的參數(shù)泽篮、返回值類型,把這些重復的代碼省去了柑船。只有在使用已經(jīng)定義好的方法時帽撑,才會用上方法引用。
——————————————————————————————
你知道的越多鞍时,不知道的越多亏拉。
如果本文章內容有問題,請直接評論或者私信我逆巍。如果覺得寫的還不錯的話及塘,點個贊也是對我的支持哦
未經(jīng)允許,不得轉載锐极!