假設一個情景: 找出滿足條件的Hero
本教程將從使用普通方法,匿名類,以及Lambda這幾種方式,逐漸的引入Lambda的概念
普通方法
public class TestLambda {
public static void main(String[] args) {
Random r = new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 10; i++) {
heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
}
System.out.println("初始化後的集合:");
System.out.println(heros);
System.out.println("篩選出 hp>100 && damange<50的英雄");
filter(heros);
}
private static void filter(List<Hero> heros) {
for (Hero hero : heros) {
if(hero.hp>100 && hero.damage<50)
System.out.print(hero);
}
}
}
匿名類方式
/*
* 匿名類方法:找出滿足條件的Hero
*/
public class TestLambda2 {
public static void main(String[] args) {
Random r = new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 5; i++) {
heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
}
System.out.println("初始化後的集合:");
System.out.println(heros);
System.out.println("使用匿名類的方式,篩選出 hp>100 && damange<50的英雄");
//創建匿名類
HeroChecker checker = new HeroChecker() {
//test用於判別
@Override
public boolean test(Hero h) {
return (h.hp>100 && h.damage<50);
}
};
//過濾器傳入數組對象和匿名類對象,匿名類用於提供test方法、
filter(heros,checker);
}
private static void filter(List<Hero> heros,HeroChecker checker) {
for (Hero hero : heros) {
if(checker.test(hero))
System.out.print(hero);
}
}
}
使用lambda
public class TestLambda3 {
public static void main(String[] args) {
Random r = new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 5; i++) {
heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
}
System.out.println("初始化後的集合:");
System.out.println(heros);
System.out.println("使用Lamdba的方式,篩選出 hp>100 && damange<50的英雄");
//第二個參數相當於一個匿名類,只保留 h即參數 -> 和判別的式子
filter(heros,h->h.hp>100 && h.damage<50);
}
private static void filter(List<Hero> heros,HeroChecker checker) {
for (Hero hero : heros) {
if(checker.test(hero))
System.out.print(hero);
}
}
}
匿名方法
與匿名類 概念相比較,
Lambda 其實就是匿名方法,這是一種把方法作爲參數進行傳遞的編程思想。
雖然代碼是這麼寫
filter(heros, h -> h.hp > 100 && h.damage < 50);
但是,Java會在背後,悄悄的,把這些都還原成匿名類方式。
引入Lambda表達式,會使得代碼更加緊湊,而不是各種接口和匿名類到處飛。
Lambda的弊端
Lambda表達式雖然帶來了代碼的簡潔,但是也有其侷限性。
1. 可讀性差,與囉嗦的但是清晰的匿名類代碼結構比較起來,Lambda表達式一旦變得比較長,就難以理解
2. 不便於調試,很難在Lambda表達式中增加調試信息,比如日誌
3. 版本支持,Lambda表達式在JDK8版本中才開始支持,如果系統使用的是以前的版本,考慮系統的穩定性等原因,而不願意升級,那麼就無法使用。
Lambda比較適合用在簡短的業務代碼中,並不適合用在複雜的系統中,會加大維護成本。