天天看點

Java Lambda 表達式

步驟 5 : 從匿名類演變成Lambda表達式頂折
Lambda表達式可以看成是匿名類一點點演變過來
1. 匿名類的正常寫法

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和{}去掉
HeroChecker c3 = (Hero h) ->h.hp>100 && h.damage<50;


4. 把 參數類型和圓括号去掉(隻有一個參數的時候,才可以去掉圓括号)

HeroChecker c4 = h ->h.hp>100 && h.damage<50;

5. 把c4作為參數傳遞進去
filter(heros,c4);


6. 直接把表達式傳遞進去
filter(heros, h -> h.hp > 100 && h.damage < 50);      
package lambda;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import charactor.Hero;

public class TestLamdba {
    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 c1 = new HeroChecker() {
            @Override
            public boolean test(Hero h) {
                return (h.hp > 100 && h.damage < 50);
            }
        };
        // 把new HeroChcekcer,方法名,方法傳回類型資訊去掉
        // 隻保留方法參數和方法體
        // 參數和方法體之間加上符号 ->
        HeroChecker c2 = (Hero h) -> {
            return h.hp > 100 && h.damage < 50;
        };

        // 把return和{}去掉
        HeroChecker c3 = (Hero h) -> h.hp > 100 && h.damage < 50;

        // 把 參數類型和圓括号去掉
        HeroChecker c4 = h -> h.hp > 100 && h.damage < 50;

        // 把c4作為參數傳遞進去
        filter(heros, c4);

        // 直接把表達式傳遞進去
        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);
        }
    }

}      

 步驟 5 : 

從匿名類演變成Lambda表達式

Lambda表達式可以看成是匿名類一點點演變過來

1. 匿名類的正常寫法

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和{}去掉

HeroChecker c3 = (Hero h) ->h.hp>100 && h.damage<50;

4. 把 參數類型和圓括号去掉(隻有一個參數的時候,才可以去掉圓括号)

HeroChecker c4 = h ->h.hp>100 && h.damage<50;

5. 把c4作為參數傳遞進去

filter(heros,c4);

6. 直接把表達式傳遞進去

filter(heros, h -> h.hp > 100 && h.damage < 50);