Lambda概述
Lambda表達式是JDK8開始后的一種新語法形式
作用:簡化匿名內部類的代碼寫法
格式:
(匿名內部類被重寫方法的形參列表)->{
被重寫方法的方法體代碼
}
注:->是語法形式惹盼,無實際意義
首先我們先定義一個抽象類妄辩,通過匿名內部類重寫其方法惑灵,再對其進行簡化,比較二者之間有何變化:
使用Lambda表達式之前:
public static void main (String[] args){
People p = new People(){
@Override
public void run(){
System.out.println("小學生跑的很慢");
}
};
p.run();
}
abstract class People{
public abstract void run();
}
使用Lambda表達式之后:
People p = ()->{
System.out.println("小學生跑的很慢");
};
//會出現(xiàn)報錯
會出現(xiàn)報錯眼耀,這是為什么呢英支?原因在于前面對于Lambda表達式的定義并不清晰,Lambda表達式并不能簡化所有匿名內部類哮伟,其只能簡化函數式接口匿名內部類的寫法形式干花,且接口中有且僅有一個抽象方法,通常楞黄,我們會再接口上加上一個@Functionalinterface注解池凄,標記該接口必須是滿足函數式接口。
真正意義上通過Lambda表達式簡化:
@FunctionalInterface//加上這個注解必須是函數式接口谅辣,且只有一個抽象方法
interface People{
void run();
}
//簡化之前的匿名內部類
People p = new People(){
@Override
public void run(){
System.out.println("小學生跑的很慢修赞!");
}
};
//簡化之后
People p = () -> {
System.out.println("小學生跑的很慢!");
};
另外,也可以將其作為參數代入方法中去使用:
//在原來的基礎上定義一個pk方法
public static void pk(People p){
System.out.println("跑步情況如何:")
p.run();
}
//不使用Lambda的情況下:
pk(p);//需要在定義匿名內部類之后柏副,將p代入勾邦;
//使用Lambda的情況:
People p = () -> {
System.out.println("小學生跑的很慢!");
};
pk(() -> {
System.out.println("小學生跑的很慢割择!");
});
//由于等號右邊即是People創(chuàng)建的對象p眷篇,因此可以可以直接將其代入
Lambda的好處:
Lambda是一個匿名函數,我們可以把Lambda表達式理解為是一段可以傳遞的代碼荔泳,它可以寫出更簡潔蕉饼、更靈活的代碼,作為一種更緊湊的代碼風格玛歌,使Java語言表達能力得到了提升昧港。
Lambda實戰(zhàn)的作用
在之前的學習過程中,我們學習過了Arrays的相關知識支子,其中有一個sort方法(可以將數組升序或降序排列)创肥,它其實也是接口類,并且只有一個抽象方法:
//精簡之前:
Arrays.sort(grade,new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
return o2 -o1;
}
});
//精簡之后:
Arrays.sort(grade,(Integer o1,Integer o2) -> {
return o2 -o1;
});
Lambda表達式省略規(guī)則
- 參數類型可以省略不寫
//參考前面的實戰(zhàn)例子
Arrays.sort(grade,(Integer o1,Integer o2) -> {
return o2 -o1;
});
//省略參數類型之后
Arrays.sort(grade,( o1, o2){
return o2 -o1;
});
- 如果只有一個參數值朋,參數類型可以省略叹侄,同時()也可以省略
//簡單引用一個單個參數的例子,不需要了解其具體含義
btn.addActionListener((ActionEvent e) -> {
System.out.println("我是簡單的例子昨登。");
});
//簡化之后:
btn.addActionListener( e -> {
System.out.println("我是簡單的例子趾代。");
});
- 如果Lambda表達式的方法體代碼只有一行代碼》崂保可以省略大括號不寫,同時要省略分號
//參照上一條規(guī)則的例子
btn.addActionListener( e -> {
System.out.println("我是簡單的例子撒强。");
});
//簡化之后:
btn.addActionListener( e -> System.out.println("我是簡單的例子。") );
- 如果Lambda表達式的方法體代碼只有一行代碼笙什∧蛲剩可以省略大括號不寫。此時得湘,如果這行代碼是return語句,必須省略return不寫顿仇,同時也必須省略";"不寫
//參照第一條規(guī)則的代碼
Arrays.sort(grade,(Integer o1,Integer o2) -> {
return o2 -o1;
});
//簡化之后:
Arrays.sort(grade,( o1, o2)-> o2 -o1);