瞭解Lamda表達式,先了解函數式接口(Function interface)
函數式接口的定義java
有且僅有一個抽象方法的接口,就是函數式接口.
例如 Runnable接口:
@FunctionalInterface public interface Runnable { public abstract void run(); }
@FunctionInterface 註解用來標識這是一個函數式接口(非必須), 當使用此註解時,接口中添加了多抽象方法時就會報紅.
函數式接口
@FunctionalInterface public interface TestFunctionInterface { void max(int i); }
匿名內部類和Lambda表達式比較
@Test public void test1(){ //匿名內部類 TestFunctionInterface t1 = new TestFunctionInterface() { @Override public void max(int i) { System.out.println("t1輸出 :"+i); } }; // Lambda表達式 TestFunctionInterface t2 = (int i)->System.out.println("t2輸出:" + i); TestFunctionInterface t3 = (int i)->{System.out.println("t3輸出:" + i);}; t1.max(20); //t1輸出 :20 t2.max(20); //t2輸出:20 t3.max(20); //t3輸出:20 }
當Lambda表達式方法體只有一句時能夠省略大括號不寫
TestFunctionInterface t2=(int i)-> ++i; System.out.println("t2輸出:" + i); /* 此時即便兩句在一行,可是依舊會報找不到i的錯誤. java中一個分號(;)表示一句話的結束, 就會斷定System.out.println("t2輸出:"+i);語句已經不在Lambda表達式的做用域內 下面加上大括號表示做用域之後就能夠正常進行運算輸出 */ TestFunctionInterface t2=(int i)->{ ++i; System.out.println("t2輸出:" + i); };
到這發現Lambda比傳統匿名內部類簡潔了許多,可是還沒完.
繼續簡化參數類型和參數括號
@Test public void test5(){ TestFunctionInterface t5=(i,j)-> System.out.println("t5輸出:"+i*j); t5.max(20,10); //t5輸出:200 } /* 當函數式接口的抽象方法只有一個參數時, 又能夠將參數外面的括號省略不寫*/ @Test public void test6(){ TestFunctionInterface t6= i -> System.out.println("t6輸出:"+i); t6.max(20); //t6輸出:20 }
寫出簡潔代碼的代碼 要從娃娃抓起.ide