Java函數式編程(二)

前言

如果你對Lambda表達式感興趣,想知道它怎麼幫助你提升專業技能,那麼,看到這篇文章就對了!我們假設大家還不知道Lambda表達式,以及Java的核心類庫的變化,我們將從「零」開始介紹這些概念、類庫和技術。

Standing on Shoulders of Giants

站在巨人的肩膀上

Why?

• 如何編寫出簡單、乾淨、易讀的程式碼——尤其是對於集合的操作?

• 如何簡單地使用並行計算提高性能?

• 如何準確的為問題建模,並且開發出更好的領域特定語言?

• 如何寫出不易出錯,並且更簡單的並發程式碼?

• 如何測試和調試Lambda 表達式?

我一猜,你們就不知道!!!

其實,我也不太清楚,哈哈,開個玩笑!我們的文章主要面向那些已經掌握了Java SE,並且想儘快了(掌)解(握)Java新特性的開發人員。當然了,如果你是初學者也沒關係,多了解了解,也可以提升編程思想(裝逼)!

如何辨別Lambda表達式

Lambda表達式除了基本的形式之外,還有幾種變體,如:

Runnable noArguments = () -> System.out.println("Hello World");    ActionListener oneArgument = event -> System.out.println("buttom clicked");    Runnable multiStatement = () -> {      System.out.print("Hello");      System.out.println(" World");  };  BinaryOperator<Long> add = (x , y) -> x + y;  BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;                                                           

上面第一行所示的Lambda表達式不包含參數,使用空括弧()表示沒有參數。該Lambda表達式實現了 Runnable 介面,該介面也只有一個 run 方法,沒有參數,且返回類型為 void。

第二行所示的Lambda表達式包含且只包含一個參數,可省略參數的括弧,這和我們在上一期講的形式是一樣的哦!

當然了,Lambda表達式的主體不僅可以是一個表達式,而且也可以是一段程式碼塊,使用大括弧({})將程式碼塊括起來。

目標

類型

目標類型是指Lambda表達式所在上下文環境的類型。比如,將Lambda表達式賦值給一個局部變數,或傳遞一個方法作為參數,局部變數或方法參數的類型就是Lambda表達式的目標類型。

隱含意思

Lambda表達式的類型依賴於上下文環境,是由編譯器推斷出來的。目標類型也不是一個全新的概念。Java中初始化數組時,數組的類型就是根據上下文推斷出來的。另一個常見的例子時null,只有將null賦值給一個變數,才能知道它的類型。比如下面這個Demo。

(等號右邊的程式碼並沒有聲明類型,系統根據上下文推斷出類型資訊)

final String[] array = { "Hello", "world" };                                  

好吧,今天就說到這,碼字排版真的很辛苦,Java函數式編程系列我們一周只更一期哦,盡請期待下周吧!『下周關鍵詞:引用值,而不是變數』,沒錯,我們從第二期開始做了一些細小的改動。。。

每周小結

• Lambda表達式的常見結構:BinaryOperator<Integer> add = (x, y) x + y;

每周名言

• 編程可以很有趣,你可以用它做密碼學研究,但兩者絕對不能合二為一。(Kreitzberg and Shneiderman)

每周問答

• 問 :為什麼JAVA文件中只能含有一個Public類?

• 答 :java 程式是從一個 public 類的 main 函數開始執行的,(其實是main執行緒),就像 C 程式 是從 main() 函數開始執行一樣。 只能有一個public 類是為了給類裝載器提供方便。 一個 public 類只能定義在以它的類名為文件名的文件中。每個編譯單元(文件)都只有一個 public 類。因為每個編譯單元都只能有一個公共介面,用 public 類來表現。該介面可以按照要求包含眾多的支援包訪問許可權的類。如果有一個以上的 public 類,編譯器就會報錯。 並且 public類的名稱必須與文件名相同(嚴格區分大小寫)。 當然一個編譯單元內也可以沒有 public 類。