Java函數式編程筆記(一)

Java函數式編程筆記(一)

什麼是函數式編程

這個問題能夠看英文的Wiki,我比較懶不想翻譯了ㄟ( ▔, ▔ )ㄏ。若是想詳細理解能夠看下知乎的討論 簡單說下函數式編程的特色:express

  1. 函數是一等公民。(大概地位就是和基本類型同樣吧)
  2. 變量不可變。(函數裏面操做的變量應該是不能被改變的)
  3. 惰性求值什麼的(這個平時編程估計感覺不到)

爲何要使用Lambda表達式

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

Java 8的Lambda表達式

Java 8的Lambda表達式的寫法

基本形式: (參數)->{表達式} BinaryOperator<Long> 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。 image_1bib1csuv12225l3sc71e1r1c82m.png-51.2kB函數式編程

函數接口

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

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

Java 8提供的函數接口:

image_1bib50kbqeh111mq17d9o1416a613.png-31.1kB

參考:

  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 版本.
相關文章
相關標籤/搜索