JAVA9都要出來了,JAVA8新特性都沒搞清楚,是否是有點掉隊哦~java
Lamda表達式,讀做λ表達式,它實質屬於函數式編程的概念,要理解函數式編程的產生目的,就要先理解匿名內部類。編程
先來看看傳統的匿名內部類調用方式:ide
interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } public static void main(String[] args) { test(new MyInterface() { @Override public void lMethod() { System.out.println("Hello World!"); } }); } }
在主類中的這麼幾行代碼,嵌套幾層就爲了輸出一個Hello World!是否是很麻煩?可是因爲java結構的完整性,咱們還不得不那麼作,如今JDK1.8來了。函數式編程
再來看看使用Lamda表達式改寫上面的代碼:函數
interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } public static void main(String[] args) { test(()->System.out.println("Hello World!")); } }
這就是Lamda表達式語言,爲了解決匿名內部類繁雜的操做而出現。spa
Lamda語法有三種形式:線程
括號()能夠大體理解爲就是方法,裏面是參數變量,在上面的例子中()->System.out.println("Hello World!") 前面的()表明void lMethod()方法,它沒有入參,因此爲空,->後面是一個單行語句;code
若是->後面是多行語句,須要用{ }裝起來,每條語句後須要有分號;blog
->後面也能夠是一個表達式,如:a+b等。class
(參數) ->單行語句:
interface MyInterface{ void lMethod(String str); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod("Hello World!");//設置參數內容 } public static void main(String[] args) { //首先在()中定義此表達式裏面須要接收變量s,後面的單行語句中就可使用該變量了 test((s)->System.out.println(s)); } }
(參數) ->{多行語句}:
interface MyInterface{ void lMethod(String str); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod("Hello World!");//設置參數內容 } public static void main(String[] args) { //首先在()中定義此表達式裏面須要接收變量s,後面的多行語句中就可使用該變量了。注意:多行語句別少「;」號 test((s)->{ s=s+s; System.out.println(s); }); } }
(參數) ->表達式:
interface MyInterface{ int lMethod(int a,int b); } public class Main { public static void test(MyInterface myInterface){ int result=myInterface.lMethod(1,2);//設置參數內容,接收返回參數 System.out.println(result); } public static void main(String[] args) { test((x,y)-> x*y );//調用方法 //至關於 // test((x,y)-> {return x*y;}); } }
這樣,Lamda表達式就看起來很簡單了,有不有!
匿名內部類,咱們比較經常使用的地方在哪兒?線程類Thread,之前咱們可能這樣寫:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程操做!");
}
});
如今,使用Lamda表達式,簡單寫爲:
new Thread(()->System.out.println("線程操做!"));
總結:利用Lamda表達式是爲了不匿名內部類定義過多無用的操做。