Lambda表達式(閉包)在很多現代化的編程語言中很常見。在Java平臺上引入lambda表達式的一個最主要原因是方便多線程的處理集合。目前,對於list和set等集合類典型的操作方式是使用迭代器。如果需要並行的處理集合,需要編寫客戶端代碼來處理,而不是集合本身處理。
在Java8中,引入閉包的目的就是爲了給集合提供函數式的方法,方便處理。這樣所帶來的好處是,集合能夠自己組織他們的元素,而不需要客戶端代碼來處理。但是,爲了使得客戶端代碼能夠使用這一改進,必須給集合添加函數式方法。當前通用的做法是使用匿名類。但是聲明匿名類帶來了過多的標準化代碼。
舉例來說,forEach方法接受一個Consumer接口的實例併爲每個元素調用它的accept方法:
interface Consumer<T> { void accept(T t); }
假設我們要使用forEach調換java.awt.Point的集合的每個元素的x與y的座標。使用Consumer的匿名內部類,我們需要編寫類似如下的代碼
pointList.forEach(new Consumer() {
public void accept(Point p) {
p.move(p.y, p.x);
}
});
而如果使用lambda表達式,我們只需要這樣:
pointList.forEach(p -> p.move(p.y, p.x));