Java函數式編程筆記(一)
什麼是函數式編程
這個問題能夠看英文的Wiki,我比較懶不想翻譯了ㄟ( ▔, ▔ )ㄏ。若是想詳細理解能夠看下知乎的討論 簡單說下函數式編程的特色:express
- 函數是一等公民。(大概地位就是和基本類型同樣吧)
- 變量不可變。(函數裏面操做的變量應該是不能被改變的)
- 惰性求值什麼的(這個平時編程估計感覺不到)
爲何要使用Lambda表達式
- 代碼會很簡潔
- 更高層次的抽象
- 處理回調函數和事件的時候更加方便
Java 8的Lambda表達式
Java 8的Lambda表達式的寫法
基本形式: (參數)->{表達式} BinaryOperator<Long> add = (Long x, Long y) -> {x + y};編程
Ps:編程語言
- 若是隻有一行語句,能夠省略表達式的大括號。 例如:Runnable singleStatement = () -> System.out.println("hello world");
- 若是隻有一個參數,能夠省略參數的括號。 例如:ActionListener oneArgument = event -> System. out.println(" button clicked");
- 參數能夠不加類型聲明,Lambda 表達式的類型依賴於上下文 環境, 能夠由編譯器推斷出來的。 例如:BinaryOperator< Long> add = (x, y) -> x + y;
- 沒有參數的時候,不能省略括號。 例如: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。
函數式編程
函數接口
定義:函數接口是隻有一個抽象方法的接口, 用做Lambda表達式的類型。
Ps:其實和之前沒有Lambda表達式,聲明回調接口的方式是同樣的。最起碼都是這麼用的,不過如今若是想寫成Lambda表達式的形式,是不能聲明一個以上的抽象方法的。函數
Java 8提供的函數接口:
![image_1bib50kbqeh111mq17d9o1416a613.png-31.1kB](http://static.javashuo.com/static/loading.gif)
參考:
- 維基百科 函數式編程 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 版本.