JAVA——lambda

假設一個情景: 找出滿足條件的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比較適合用在簡短的業務代碼中,並不適合用在複雜的系統中,會加大維護成本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章