Java函數式程式設計筆記(一)-Lambda表達式
什麼是函數式程式設計
這個問題可以看英文的Wiki,我比較懶不想翻譯了ㄟ( ▔, ▔ )ㄏ。如果想詳細了解可以看下知乎的讨論
簡單說下函數式程式設計的特點:
- 函數是一等公民,是以也就是有了如下用法。
- 變量不可變。
- 惰性求值什麼的(這個平時程式設計估計感受不到)
為什麼要使用Lambda表達式
- 代碼會很簡潔
- 更高層次的抽象
- 處理回調函數和事件的時候更加友善
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。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SbygzYxIXMlFzNjN3MsVjMyITM2V3cjFjYpJWMfV2Zh1Wavw1NvFWY5hnN0hWN4FmewZXMz0GerljcrV3LcVHbvJ2bi9CXt92Yu8WdsVnY5pnLjlGdhR3cvw1LcpDc0RHaiojIsJye.png)
函數接口
定義:函數接口是隻有一個抽象方法的接口, 用作Lambda表達式的類型。
Ps:其實和以前沒有Lambda表達式,聲明回調接口的方式是一樣的。最起碼都是這麼用的,不夠現在如果想寫成Lambda表達式的形式,是不能聲明一個以上的抽象方法的。
Java 8提供的函數接口:
參考:
- 維基百科 函數式程式設計 https://www.wikiwand.com/en/Functional_programming
- 維基百科 程式設計範性 https://www.wikiwand.com/zh/%E7%BC%96%E7%A8%8B%E8%8C%83%E5%9E%8B
- 維基百科 函數式程式設計語言 https://www.wikiwand.com/zh/%E5%87%BD%E6%95%B8%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80
- [英]沃伯頓(Richard Warburton). Java 8函數式程式設計 (圖靈程式設計叢書) 人民郵電出版社. Kindle 版本.