簡(jiǎn)介
如上圖所示旦签,綠色框中就是Lambda表達(dá)式,是可以執(zhí)行的代碼塊肪跋。Lambda表達(dá)式是很多編程語言的特征歧蒋,比如Lisp, Python, Scala等。
但是對(duì)于java州既,在8以后才支持這種寫法谜洽。在此之前,如果想執(zhí)行一個(gè)代碼塊吴叶,我們需要新建一個(gè)對(duì)象褥琐,并傳遞這個(gè)對(duì)象,比如使用策略模式晤郑。java 8以后敌呈,可以把某個(gè)功能視為方法參數(shù)贸宏,并傳遞一個(gè)代碼塊。
對(duì)于java 8來說磕洪,Lambda表達(dá)式的憑借著自身的強(qiáng)大吭练,而備受關(guān)注。
在本文中析显,我將簡(jiǎn)單地介紹下函數(shù)式編程在java 8中的運(yùn)用鲫咽。這是java 8 lambda系列的一部分。
1谷异,java 8以前如何排序
下面將介紹如何使用 comparator 對(duì)自定義數(shù)組的排序分尸。
- 需要被排序的類:Dog
public class Dog {
String name;
int height;
int weight;
public Dog(String n, int s, int w) {
this.name = n;
this.height = s;
this.weight = w;
}
public String toString() {
return getName() + ": size=" + getHeight() + " weight=" + getWeight()
+ " \n";
}
//setters and getters ...
}
- 國(guó)際慣例,為了排序這些狗子歹嘹,打算使用
Arrays.sort(...)
箩绍,然而此方法第二個(gè)參數(shù)是一個(gè)比較器(comparator,下同)尺上,所以需要構(gòu)造一個(gè)比較器材蛛,如下是一個(gè)利用策略模式的經(jīng)典例子。
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Stream;
public class ArraysSort {
public static void main(String[] args) {
Dog d1 = new Dog("Max", 2, 50);
Dog d2 = new Dog("Rocky", 1, 30);
Dog d3 = new Dog("Bear", 3, 40);
Dog[] dogArray = { d1, d2, d3 };
printDogs(dogArray);
Arrays.sort(dogArray, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.getWeight() - o2.getWeight();
}
});
printDogs(dogArray);
}
public static void printDogs(Dog[] dogs) {
System.out.println("--Dog List--");
for (Dog d : dogs)
System.out.print(d);
System.out.println();
}
}
2怎抛,通過Lambda表達(dá)式排序
- 在java 8卑吭,只要如下一行簡(jiǎn)單的代碼實(shí)現(xiàn)
Arrays.sort(dogArray, (Dog m, Dog n) -> m.getWeight() - n.getWeight());
printDogs(dogArray);
(Dog m, Dog n) -> Integer.compare(m.getWeight(), n.getWeight())
就是Lambda表達(dá)式。它被偷偷地轉(zhuǎn)換成了比較器對(duì)象马绝。我們可以暫時(shí)把lambda表達(dá)式簡(jiǎn)單地認(rèn)為是一個(gè)方法豆赏。至于lambda表達(dá)式如何轉(zhuǎn)成函數(shù)式接口是一個(gè)復(fù)雜的故事。
3富稻,Lambda表達(dá)式的語法
語法包含一下幾點(diǎn):
- 以逗號(hào)分隔河绽,以()關(guān)閉的形參:
(Dog m, Dog n)
- 箭頭標(biāo)記:
->
- 主體部分則是一個(gè)單表達(dá)式或者聲明代碼塊。如下是單表達(dá)式形式:
- Integer.compare(m.getWeight(), n.getWeight())
當(dāng)然了唉窃,我們也能使用其他不同的方式去寫lambda表達(dá)式的。
4纹笼,Stream 應(yīng)用程序接口
為什么在java 8中纹份,lambda表達(dá)式這么強(qiáng)大?Stream API起了很大作用廷痘。(注:stream不翻譯)在java 8中蔓涧,stream是支持順序和并行聚合操作的元素序列。
通過使用streams笋额,可以簡(jiǎn)單地通過一塊代碼去篩選元暴,并將篩選功能應(yīng)用于stream中的每一個(gè)元素。
對(duì)于上文的狗子排序兄猩,也通過stream實(shí)現(xiàn)茉盏,如下:
import java.util.stream.Stream;
public class Java8WhyLambda {
public static void main(String[] args) {
// create an array of dogs
Dog d1 = new Dog("Max", 2, 50);
Dog d2 = new Dog("Rocky", 1, 30);
Dog d3 = new Dog("Bear", 3, 40);
Dog[] dogArray = { d1, d2, d3 };
// use stream to sort
Stream<Dog> dogStream = Stream.of(dogArray);
Stream<Dog> sortedDogStream = dogStream.sorted((Dog m, Dog n) -> Integer.compare(m.getHeight(), n.getHeight()));
sortedDogStream.forEach(d -> System.out.print(d));
}
}