什么是函數(shù)式接口?
只包含一個抽象方法的接口,稱為函數(shù)式接口。
通常我們會在函數(shù)式接口上使用@FunctionalInterface注解來標記它是一個函數(shù)式接口,使用了該注解標記的接口,會在編譯期檢查該接口是否是函數(shù)式接口,提醒開發(fā)者。(非強制性,不使用該注解標記,只要符合只包含一個抽象方法要求同樣是函數(shù)式接口,但建議使用)
什么是Lambda表達式?
Lambda 是一個匿名函數(shù),我們可以把 Lambda 表達式理解為是一段可以傳遞的代碼(作為參數(shù)傳入方法中)。而函數(shù)式接口可以簡寫為Lambda表達式,寫出更簡潔、更靈活的代碼。函數(shù)式接口和Lambda表達式相輔相成,為Java語言提供了一種更緊湊更易于理解的寫法。
// 通常lambda表達式 (a, b) -> { ...}
左側:指定了 Lambda 表達式需要的參數(shù)列表
**右側:**指定了 Lambda體,是抽象方法的實現(xiàn)邏輯,也即Lambda表達式要執(zhí)行的功能
常規(guī)形式(有參數(shù)類型,有括號,有花括號)
public class lamda { public static void main(String[] args) { Hello like = (int i)->{ System.out.println("hello" + i); }; like.hello(5); } } interface Hello { void hello(int i); }
對于多個參數(shù)的方法:
public class lamda { public static void main(String[] args) { Hello like = (i,j)->{ System.out.println("hello" + i + j); }; like.hello(5,"world"); } } interface Hello { void hello(int i,String j); }
對于無參或者一個參數(shù)的方法:
public class lamda { public static void main(String[] args) { Hello like = i->{ System.out.println("hello" + i); }; like.hello(5,); } } interface Hello { void hello(int i); }
對于只有一行代碼的方法:
public class lamda { public static void main(String[] args) { Hello like = (i,j)->System.out.println("hello" + i + j); like.hello(5,"world"); } } interface Hello { void hello(int i,String j); }
總結:
前提是接口為函數(shù)式接口(只有一個方法的接口)
以上所有簡化形式可以一起使用,即可以既簡化參數(shù)類型,又可以簡化括號
lambda表達式只能有一行代碼的情況下才能簡化成為一行,如果有多行,那么就用代碼塊包裹。
多個參數(shù)也可以去掠參數(shù)類型,要去掉就都去掉,必須加上括號