JDK1.8 Lambda 表達式的使用

百度百科的解釋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 配合使用

相關文章
相關標籤/搜索