lambda 表達式是 java se8 推出的新功能,也是java第一次引入函數式程式設計的嘗試。
lambda 表達式可以看做是一種匿名函數,但是它沒有通路修飾符、傳回值和名字。lambda表達式由兩部分構成,形式參數和方法體,中間用<code>“->”</code>符号分隔。其中的形式參數類型能夠進行自動推斷,可以不寫。當然在某些特殊情況下,形參類型也是不可缺少的。方法體可以是簡單的表達式或者代碼塊,下面是一些例子:
要了解lambda表達式,首先要了解一種特殊的接口:函數式接口。什麼是函數式接口呢?簡單來說就是隻包含一個抽象方法的接口。java标準庫中的<code>java.lang.runnable</code>和<code>java.util.comparator</code>就是典型的函數式接口。對于函數式接口,我們就可以使用lambda表達式來代替用傳統匿名類來建立執行個體對象。
我們以<code>runnable</code>接口為例,用傳統匿名類的方式建立一個線程:
上面傳統匿名類方式中,我們可以看到,我們需要<code>new</code>一個接口名稱,接口内部還要附帶這個接口抽象方法的實作。而如果我們使用lambda表達式,則代碼非常簡潔:
通過上面代碼我們可以看到,lambda表達式在兩方面做了簡化:
首先不需要聲明<code>runnable</code>接口,因為這可以通過上下文推斷出來
其次不需要再寫一個<code>run</code>方法的實作,因為函數式接口中隻有一個方法
在java se8之前标準庫中的函數式接口并不多。javase8增加了<code>java.util.function</code>包,裡面都是可以在開發中隻用的函數式接口。我們也可以自定義一個函數式接口,但最好在接口上使用<code>@functionalinterface</code>注解标明這是一個函數式接口,以免團隊其它成員錯誤地往接口添加新的方法,當然<code>java.util.function</code>包中的所有接口都添加了<code>@functionalinterface</code>注解。
下面代碼使用函數式接口<code>java.util.function</code>接口實作的對清單map進行操作的方法,從代碼中可以看出,如果使用函數式程式設計,代碼看起來會非常簡潔:
如果我們在上面接口中再加一個抽象方法:
由于自定義接口中出現了兩個抽象方法,不符合函數式接口定義,此時會抛出編譯錯誤。我們再測一下上面這個自定義函數式接口: