lambda整理

認識lambda表達式

學習背景:

我是在學習線程的時候,第一次遇見了lambda表達式,當時對於這個知識點還非常的陌生,應該說是從來沒見過。於是乎,爲了充實自己的之時,我去學習了lambda表達式。

我們先來看一下lambda表達式到底長什麼樣子

  • 當然,對於我這個小白來說,學習的時候我得先知道這個洋氣的東西叫啥呀,一個英語單詞,但是不會讀。學習的時候,在視頻裏,我知道搞了半天,這個東西就是數學裏常用到的λ。當時的我感到無比的…
  • 舉個栗子:()->{System.out.println("msn")}沒錯,這個東西就是一個lambda表達式,我相信,大家差不多能猜到這句代碼是什麼意思,就是讓控制檯輸出‘msn’三個字母。

那麼,我們通過對這個代碼的解釋,來了解如何書寫lambda表達式

  • 首先,我們要知道什麼樣的代碼纔可以使用lambda表達式來化簡代碼
  • 其次,要知道lambda表達式的書寫形式及其解釋
lambda表達式的使用情況
  • 一個接口,而且這個接口中只有一個抽象方法,我們可以使用lambda表達式對抽象方法進行重寫。比如線程中Runnable接口需要作爲Thread的參數時。
    通常情況下,我們需要實現Runnable接口重寫run方法,然後創建此實現類的對象,將此對象作爲參數傳遞給Thread;或者使用匿名內部類的方法重寫run方法。但是,以上過程可以通過lambda表達式的方式進行代碼的簡化。

lambda表達式具體實現

  • 範式:(parameter list)->{code block}
  • 說明:
    • parameter list:參數列表。內容是接口中的抽象方法的參數。如果沒有參數就空着。參數需要加類型。java11後,參數可以是var類型的。

    • ->:固定寫法:相當於表示這一串代碼是lambda表達式,這個符號也是意味着指向下面的代碼塊

    • code block:代碼塊。我們在抽象方法中具體要執行的代碼

      • 注意:lambda表達式中的變量有一些要求,必須是final或者effective final的。
        Local variable a defined in an enclosing scope must be final or effectively final
        這句話是什麼意思呢?
        final自然不用多說了,就是常量的意思。code block中可以使用常量。effective final呢?實際的常量,有效的常量,其實就是說,當我們在lambda外定義了一個並不是final修飾的變量,但是這個變量的值賦值一次後並沒有發生過改變,則編譯器會把這個變量當作一個常量來處理。
        也即是下面幾種情況:
        1.定義了一個變量,但是沒有賦值,在lambda中不可以使用
        2.定義了一個變量,並且賦值一次,在lambda中可以使用
        3.lambda外定義了一個變量,並且多次賦值,或者進行過++,--等改變值的操作,在lambda不可以使用
        4.在lambda中定義了一個變量,可以進行數值的操作,lambda可以正常使用
        5.定義的final 變量,自然可以使用
    • lambda表達式的缺省規則

      • 當滿足特定的條件時,lambda表達式可以省略
        • 可以省略參數的類型。如果有多個參數,不能只省略一個,必須全部省略
        • 如果只有一個參數,可以省略參數的小括號
        • 如果代碼塊只有一條語句:
          如果沒有返回值,可以將大括號和代碼後的分號省略
          如果有返回值,在省略大括號和分號後,需要將return省略

lambda表達式注意事項

  • 必須要有接口,接口中只能有一個方法
  • 必須要有上下文環境
    • 當我們使用lambda表達式時,只提供了參數和方法體,所以單獨寫lambda表達式是不知道實現了哪個類的哪個方法的。又由於lambda表達式中只有一個抽象方法,所以只要提供他是屬於哪一個接口的就可以。

      • 因此,使用時,要麼使用lambda給一個對象賦值。Runnable r=()->{Syste.out.rintln("aa");}
      • 要麼作爲參數,而且這個方法的參數是可以根據方法唯一確定的。new Thread(()->{...})
      • 或者作爲函數的返回值。因爲返回值的類型也是確定的。
      • 或者作爲數組的元素。同理
    • 總之,lambda表達式相當於實現了對象接口並創建了其對象的意思。對象能做的,lambda表達式都可以做。

lambda表達式中使用this

因爲靜態方法中不能使用this,所以要使用lambda表達式中使用this,一定是在一個非靜態方法中,而非靜態方法的this就是當前對象,所以lambda的this就是當前對象。lambda表達式不開闢新的作用域。與匿名內部類不同。因爲使用匿名內部類時也需要new 一個對象,自然this指的是new 的新對象啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章