雖然JVM有著Scala 、Groovy 、Clojure 等依賴于JVM的函數(shù)語式語言,但直到Java8才算是java正式支持函數(shù)式編程; Java8中加入了Lambda的支持標(biāo)志著Java正式加入了混合式編程語言(支持命令式編程與函數(shù)式編程)的行列;像C#、Python都是同時(shí)支持兩種編程范式,近年來函數(shù)式編程愈演愈烈,大有命令式編程向函數(shù)式編程靠攏的趨勢(shì); 命令式編程與函數(shù)式編程的最基本區(qū)別在于使用的計(jì)算模型的不同,命令式編程是基于圖靈機(jī)的,而函數(shù)式編程使用的是lambda演算; 有了lambda的支持使用Java8可以寫出可讀性更高的代碼,減少代碼的繁雜度、傳遞行為等;
比較像之前我們實(shí)現(xiàn)一個(gè)接口的時(shí)候可以使用匿名內(nèi)部類的方式,先看下匿名內(nèi)部類實(shí)現(xiàn):
Runnable PRimitive=new Runnable() { @Override public void run() { System.out.println("inner class"); } }; lambda的實(shí)現(xiàn): Runnable lambda = ()-> System.out.println(" lambda "); 比較兩種實(shí)現(xiàn)方式lambda的簡潔程度是匿名內(nèi)部類沒法比的,lambda實(shí)現(xiàn)可以理解為傳遞行為給Runnable,而匿名內(nèi)部類則是現(xiàn)實(shí)了Runnable接口;是不是lambda可以代替匿名內(nèi)部類出現(xiàn)在所有地方呢? 答案不是的。 Lambda只能代替內(nèi)部類出現(xiàn)在的接口為函數(shù)接口(FunctionalInterface)的地方。
語法 lambda語法: () -> {} 1、 ()里面為函數(shù)接口的參數(shù),{} 與要傳遞到函數(shù)接口的語句; 2、 lambda方式如果有多條語句還可以用{ 括號(hào)括起來; 3、 如只有一條語句則可以省略{},函數(shù)接口存在返回值當(dāng)->后面只有單條語句時(shí)return可以省略,如有多條語句則需要顯示return返回該值;函數(shù)接口(Functionalnterface):只定義一個(gè)抽象方法的接口默認(rèn)為函數(shù)接口,接口中可以有default方法和static方法,;
簡單應(yīng)用//實(shí)現(xiàn)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函數(shù)式編程》 文章首發(fā)地址:Solinx http://www.solinx.co/archives/382
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注