雖然JVM有着Scala 、Groovy 、Clojure 等依賴于JVM的函數語式語言,但直到Java8才算是java正式支援函數式程式設計;
Java8中加入了Lambda的支援标志着Java正式加入了混合式程式設計語言(支援指令式程式設計與函數式程式設計)的行列;像C#、Python都是同時支援兩種程式設計範式,近年來函數式程式設計愈演愈烈,大有指令式程式設計向函數式程式設計靠攏的趨勢;
指令式程式設計與函數式程式設計的最基本差別在于使用的計算模型的不同,指令式程式設計是基于圖靈機的,而函數式程式設計使用的是lambda演算; 有了lambda的支援使用Java8可以寫出可讀性更高的代碼,減少代碼的繁雜度、傳遞行為等;
比較
像之前我們實作一個接口的時候可以使用匿名内部類的方式,先看下匿名内部類實作:
Runnable primitive=new Runnable() {
@Override
public void run() {
System.out.println("inner class");
}
};
lambda的實作: Runnable lambda = ()-> System.out.println(" lambda ");
比較兩種實作方式lambda的簡潔程度是匿名内部類沒法比的,lambda實作可以了解為傳遞行為給Runnable,而匿名内部類則是現實了Runnable接口;
是不是lambda可以代替匿名内部類出現在所有地方呢? 答案不是的。 Lambda隻能代替内部類出現在的接口為函數接口(FunctionalInterface)的地方。
文法
lambda文法: () -> {}
1、 ()裡面為函數接口的參數,{} 與要傳遞到函數接口的語句;
2、 lambda方式如果有多條語句還可以用{ 括号括起來;
3、 如隻有一條語句則可以省略{},函數接口存在傳回值當->後面隻有單條語句時return可以省略,如有多條語句則需要顯示return傳回該值;
函數接口(Functionalnterface):隻定義一個抽象方法的接口預設為函數接口,接口中可以有default方法和static方法,也可以使用@FuncationalInterface注解該接口;
簡單應用
//實作x+y相加
BinaryOperator<Integer> addOperator = (x, y) -> x+y;
System.out.println(addOperator.apply(3,4));
Java8中除了在Runnable、Comparator等以往存在的接口添加了FuncationalInterface注解外還在java.util.function包中新加入了大批FuncatinalInterface接口;使用java.util.function包下面的接口可以大大簡化我們的程式設計;
參考資料:
《Java8函數式程式設計》
文章首發位址:Solinx
http://www.solinx.co/archives/382