Lambda表達式是Java8的重要更新。Lambda表達式支持將代碼塊作爲方法參數,Lambda表達式允許使用更簡潔的代碼來創建只有一個抽象方法的接口(這種接口被稱爲函數式接口)的實例。
首先,我們先使用匿名內部類來寫一個例子,然後對比Lambda表達式。
先寫一個接口:
public interface Command {
//接口裏定義的process方法用於封裝“處理行爲”
void process(int[] target);
}
匿名內部類:
public class CommandTest {
public static void main(String[] args){
ProcessArray pa = new ProcessArray();
int[] target = {3,-4,6,4};
//處理數組,具體處理行爲取決於匿名內部類
pa.process(target, new Command(){
@Override
public void process(int[] target) {
// TODO 自動生成的方法存根
int sum = 0;
for(int tmp : target){
sum += tmp;
}
System.out.println("數組元素的總和是:" + sum);
}
});
}
}
Lambda表達式:
public class CommandTest2 {
public static void main(String[] args){
ProcessArray pa = new ProcessArray();
int[] array = {3,-4,6,4};
pa.process(array, (int[] target)->{
int sum = 0;
for(int tmp : target){
sum += tmp;
}
System.out.println("數組元素的總和:" + sum);
});
}
}
由上面可以看出,Lambda表達式簡化創建匿名內部類對象。
Lambda表達式的主要作用就是代替匿名內部類的繁瑣語法。它由三部分組成。
——形參列表。形參列表允許省略形參類型。如果形參列表中只有一個參數,甚至連形參列表的圓括號也可以省略。
——箭頭(->)。必須通過英文中畫線和大於符號組成。
——代碼塊。如果代碼塊只包含一條語句,Lambda表達式允許省略代碼塊的花括號,那麼這條語句就不要用花括號表示語句結束。Lambda代碼塊中只有一條return語句,甚至可以省略return關鍵字。Lambda表達式需要返回值,而它的代碼塊中僅有一條省略了return的語句,Lambda表達式會自動返回這條語句的值。
Lambda表達式的幾種簡化寫法:
interface Eatable{
void taste();
}
interface Flyable{
void fly(String weather);
}
interface Addable{
int add(int a, int b);
}
public class LambdaQs {
//調用該方法需要Eatable對象
public void eat(Eatable e){
System.out.println("我在吃蘋果");
e.taste();
}
//調用該方法需要Flyable對象
public void drive(Flyable f){
System.out.println("我正在駕駛:" + f);
f.fly("【碧空如洗的晴空】");
}
//調用該方法需要Addable對象
public void test(Addable add){
System.out.println("5與3的和爲:" + add.add(5, 3));
}
public static void main(String[] args){
LambdaQs lq = new LambdaQs();
//Lambda表達式的代碼塊只有一條語句,可以省略花括號
lq.eat(()->System.out.println("蘋果的味道不錯!"));
//Lambda表達式的形參列表只有一個形參,可以省略圓括號
lq.drive(weather->{
System.out.println("今天的天氣是:" + weather);
System.out.println("直升機飛行平穩");
});
//Lambda表達式的代碼塊只有一條語句,可以省略花括號
//代碼塊中只有一條語句,即使該表達式需要返回值,也可以省略return關鍵字
lq.test((a,b)->a + b);
}
}