Lambda表達式能夠當作是匿名類一點點演變過來
1. 匿名類的正常寫法
java
HeroChecker c1 = new HeroChecker() {
public boolean test(Hero h) {
return (h.hp>100 && h.damage<50);
}
};
2. 把外面的殼子去掉
只保留方法參數和方法體
參數和方法體之間加上符號 ->
數組
HeroChecker c2 = (Hero h) ->{
return h.hp>100 && h.damage<50;
};
3. 把return和{}去掉
spa
HeroChecker c3 = (Hero h) ->h.hp>100 && h.damage<50;
4. 把 參數類型和圓括號去掉(只有一個參數的時候,才能夠去掉圓括號)
設計
HeroChecker c4 = h ->h.hp>100 && h.damage<50;
5. 把c4做爲參數傳遞進去
code
filter(heros,c4);
6. 直接把表達式傳遞進去
filter(heros, h -> h.hp > 100 && h.damage < 50);
Lambda比較適合用在簡短的業務代碼中,並不適合用在複雜的系統中,會加大維護成本。
2、引用靜態方法
首先爲TestLambda添加一個靜態方法:
public static boolean testHero(Hero h) {
return h.hp>100 && h.damage<50;
}
Lambda表達式:
filter(heros, h->h.hp>100 && h.damage<50);
在Lambda表達式中調用這個靜態方法:
filter(heros, h -> TestLambda.testHero(h) );
調用靜態方法還能夠改寫爲:
filter(heros, TestLambda::testHero);
2、引用對象方法
TestLambda testLambda = new TestLambda();
filter(heros, testLambda::testHero);
3、引用構造方法
有的接口中的方法會返回一個對象,好比
java.util.function.Supplier提供
了一個get方法,返回一個對象。
public interface Supplier<T> {
T get();
}
設計一個方法,參數是這個接口
public static List getList(Supplier<List> s){
return s.get();
}
爲了調用這個方法,有3種方式
第一種匿名類:
Supplier<List> s = new Supplier<List>() {
public List get() {
return new ArrayList();
}
};
List list1 = getList(s);
第二種:Lambda表達式
List list2 = getList(()->new ArrayList());
第三種:引用構造器
List list3 = getList(ArrayList::new);
4、聚合操做
要了解聚合操做,首先要創建
Stream和管道的概念
Stream 和Collection結構化的數據不同,Stream是一系列的元素,就像是生產線上的罐頭同樣,一串串的出來。
管道指的是一系列的聚合操做。
管道又分3個部分
管道源:在這個例子裏,源是一個List
中間操做: 每一箇中間操做,又會返回一個Stream,好比.filter()又返回一個Stream, 中間操做是「懶」操做,並不會真正進行遍歷。
結束操做:當這個操做執行後,流就被使用「光」了,沒法再被操做。因此這一定是流的最後一個操做。 結束操做不會返回Stream,可是會返回int、float、String、 Collection或者像forEach,什麼都不返回, 結束操做才進行真正的遍歷行爲,在遍歷的時候,纔會去進行中間操做的相關判斷
每一箇中間操做,又會返回一個Stream,好比.filter()又返回一個Stream, 中間操做是「懶」操做,並不會真正進行遍歷。
中間操做比較多,主要分兩類
對元素進行篩選 和 轉換爲其餘形式的流
對元素進行篩選:
filter 匹配
distinct 去除重複(根據equals判斷)
sorted 天然排序
sorted(Comparator<T>) 指定排序
limit 保留
skip 忽略
轉換爲其餘形式的流
mapToDouble 轉換爲double的流
map 轉換爲任意類型的流
當進行結束操做後,流就被使用「光」了,沒法再被操做。因此這一定是流的最後一個操做。 結束操做不會返回Stream,可是會返回int、float、String、 Collection或者像forEach,什麼都不返回,。
結束操做才真正進行遍歷行爲,前面的中間操做也在這個時候,才真正的執行。
常見結束操做以下:
forEach() 遍歷每一個元素
toArray() 轉換爲數組
min(Comparator<T>) 取最小的元素
max(Comparator<T>) 取最大的元素
count() 總數
findFirst() 第一個元素