Lambda

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() 第一個元素
相關文章
相關標籤/搜索