百度百科的解釋:java
「Lambda 表達式」(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式能夠表示閉包(注意和數學傳統意義上的不一樣)。express
基本的語法:api
List<String> lists=Arrays.asList("a","b","c","d"); for (String s:lists){ System.out.println(s); } //1.只能順序處理List中的元素(process one by one) //2.不能充分利用多核CPU //3.不利於編譯器優化 List<String> lists2=Arrays.asList("a","b","c","d"); lists2.forEach(i-> System.out.println(i)); //1.不必定須要順序處理List中的元素,順序能夠不肯定 //2.能夠並行處理,充分利用多核CPU的優點 //3.有利於JIT編譯器對代碼進行優化
lambda表達式能夠分解成三部分來看: (1)參數列表 (2)-> (3)lambda體,閉包
i -> System.out.println(i))併發
左邊是參數列表,lambda能夠接收任意多個參數,當參數數量大於1時,須要將參數括起來,如 app
(i,j)->System.out.println(i+j))函數
若是不須要指定參數,須要使用()來表示無參,如性能
()->System.out.println("hello lambda")學習
能夠看到咱們並無聲明參數的數據類型,這是由於不少狀況下,編譯器能從上下文中推導出數據的參數類型,固然咱們能夠顯示的指定類型優化
(int i,int j)->System.out.println(i+j))
函數箭頭的右側是lambda體,上面的例子中只有一行代碼,當有多行代碼時,須要使用{}括起來,如
(i,j) ->{System.out.println(i);System.out.println("----"); }
若是lambda體中的表達式有返回值,須要使用return來返回,也能夠後面跟一個參數來停止lambda體,
(i,j)->return i+j 或 (i,j)->i+j;
函數式接口:
理解函數式接口,是學習lambda表達式的關鍵,函數式接口的定義其實比較簡單,對於任意一個接口(interface),若是他只包含一個(抽象)方法,那麼這個接口就能夠稱之爲函數式接口,這種接口被@FunctionalInterface註解標示。引入了一個新的包java.util.function,這個包中定義了不少函數式接口用於支持lambda表達式。
@FunctionalInterface public interface Function<T, R> { R apply(T t); } public static int changeTheValue(int value ,Function<Integer,Integer> function){ return function.apply(value); } @Test public void testChangeTheValue(){ int value=10; int result1=changeTheValue(value,i->i+5); System.out.println("result1:"+result1); int result2=changeTheValue(value,(i)->i*30); System.out.println("result2"+result2); }
總結優勢:簡潔,併發更有優點。
缺點:不在併發狀況使用,有時候會下降性能,不易於調試。
認識還比較淺,畢竟使用的少,之後會隨着本身的認識加深補充修改。
補充知識點 Streamapi 和 lambda 配合使用