Lambda表達式
什麼是 Lambda表達式?
Lambda表達式是Java SE 8中一個重要的新特性。lambda表達式允許你通過表達式來代替功能接口。 lambda表達式就和方法一樣,它提供了一個正常的參數列表和一個使用這些參數的主體(body,可以是一個表達式或一個代碼塊)。 Lambda 表達式(Lambda expression)可以看作是一個匿名函數,一段可傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼,作爲一種更緊促的代碼風格,使Java語言表達能力得到提升
語法
(parameters) -> expression 或 (parameters) ->{ statements; }
- paramaters:類似方法中的形參列表,這裏的參數是函數式接口裏的參數。這裏的參數類型可以明確的聲明
也可不聲明而由JVM隱含的推斷。另外當只有一個推斷類型時可以省略掉圓括號。 - ->:可理解爲“被用於”的意思
- 方法體:可以是表達式也可以代碼塊,是函數式接口裏方法的實現。代碼塊可返回一個值或者什麼都不返回,這裏的代碼塊等同於方法的方法體。如果是表達式,也可以返回一個值或者什麼都不返回
例子
無參數無返回值,並且lambda體中只有一條語句,則->左側括號不能省略,右側的{}可以省略
//無參數無返回值,並且lambda體中只有一條語句,則->左側括號不能省略,右側的{}可以省略
public static void test1(){
Runnable r1=new Runnable() {
@Override
public void run() {
System.out.println("run1");
}
};
r1.run();
Runnable r2=()-> System.out.println("run2");
r2.run();
}
有一個參數,並且lambda體中只有一條語句,則->左側括號與右側的{}均可以省略不寫
public static void test2(){
Consumer<String> con1 = (e)-> {System.out.println(e);};
con1.accept("hello Lambda");
// 如果只有一個參數,參數的括號可以省略
// 如果lambda表達式體只有一條語句,lambda題的{}也可以省略
Consumer<String> con2 = e-> System.out.println(e);
con2.accept("hello Lambda");
}
有返回值,但是Lambda體中只有一條語句時,則->右側的{}可以省略不寫
public static void test3(){
List<Integer> list = Arrays.asList(3,2,1,4,0);
list.sort((e1,e2)->Integer.compare(e1,e2));
list.forEach(e-> System.out.print(e + " "));
}
有兩個以上參數,有返回值,並且Lambda體中有多條語句,()和{}都不能省略
Comparator<Employee> cmp = (e1, e2)->{
System.out.println("函數式接口");
return e1.getAge() - e2.getAge();
};
lambda表達式參數列表的類型可以省略不寫,因爲JVM編譯器會通過上下文信息進行推演
Comparator<Employee> cmp = (Employee e1, Employee e2)->{
System.out.println("函數式接口");
return e1.getAge() - e2.getAge();
}