天天看點

Java函數式程式設計筆記(一)—— Lambda表達式Java函數式程式設計筆記(一)-Lambda表達式

Java函數式程式設計筆記(一)-Lambda表達式

什麼是函數式程式設計

這個問題可以看英文的Wiki,我比較懶不想翻譯了ㄟ( ▔, ▔ )ㄏ。如果想詳細了解可以看下知乎的讨論

簡單說下函數式程式設計的特點:

  1. 函數是一等公民,是以也就是有了如下用法。
  2. 變量不可變。
  3. 惰性求值什麼的(這個平時程式設計估計感受不到)

為什麼要使用Lambda表達式

  1. 代碼會很簡潔
  2. 更高層次的抽象
  3. 處理回調函數和事件的時候更加友善

Java 8的Lambda表達式

Java 8的Lambda表達式的寫法

基本形式:

(參數)->{表達式}

BinaryOperator add = (Long x, Long y) -> {x + y};

Ps:

1. 如果隻有一行語句,可以省略表達式的大括号。

例如:Runnable singleStatement = () -> System.out.println(“hello world”);

2. 如果隻有一個參數,可以省略參數的括号。

例如:ActionListener oneArgument = event -> System. out.println(” button clicked”);

3. 參數可以不加類型聲明,Lambda 表達式的類型依賴于上下文 環境, 可以由編譯器推斷出來的。

例如:BinaryOperator< Long> add = (x, y) -> x + y;

4. 沒有參數的時候,不能省略括号。

例如:Runnable singleStatement = () -> System.out.println(“hello world”);

值引用,而不是位址

在Java 8以前使用匿名内部類的時候,内部使用外部引用類型的變量,都需要将變量聲明為final。在Lambda表達式中同樣如此,隻是Java 8放松了這一限制,可以引用非final變量,但是該變量在既成事實上必須是final。如果給傳入Lambda表達式中的變量多次指派,編譯器酒會報這樣一個錯誤:

資訊: local variables referenced from a Lambda expression must be final or effectively final。

Java函數式程式設計筆記(一)—— Lambda表達式Java函數式程式設計筆記(一)-Lambda表達式

函數接口

定義:函數接口是隻有一個抽象方法的接口, 用作Lambda表達式的類型。

Ps:其實和以前沒有Lambda表達式,聲明回調接口的方式是一樣的。最起碼都是這麼用的,不夠現在如果想寫成Lambda表達式的形式,是不能聲明一個以上的抽象方法的。

Java 8提供的函數接口:

Java函數式程式設計筆記(一)—— Lambda表達式Java函數式程式設計筆記(一)-Lambda表達式

參考:

  1. 維基百科 函數式程式設計 https://www.wikiwand.com/en/Functional_programming
  2. 維基百科 程式設計範性 https://www.wikiwand.com/zh/%E7%BC%96%E7%A8%8B%E8%8C%83%E5%9E%8B
  3. 維基百科 函數式程式設計語言 https://www.wikiwand.com/zh/%E5%87%BD%E6%95%B8%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80
  4. [英]沃伯頓(Richard Warburton). Java 8函數式程式設計 (圖靈程式設計叢書) 人民郵電出版社. Kindle 版本.