ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 步骤 1 : 引用静态方法 首先为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); ``` 这种方式就叫做引用静态方法 ``` package lambda; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Random; public class TestLambda4 { 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 && damage<50的英雄"); HeroChecker c = new HeroChecker() { public boolean test(Hero h) { return h.hp > 100 && h.damage < 50; } }; System.out.println("使用匿名类过滤"); filter(heros, c); System.out.println("使用Lambda表达式"); filter(heros, h -> h.hp > 100 && h.damage < 50); System.out.println("在Lambda表达式中使用静态方法"); filter(heros, h -> TestLambda4.testHero(h)); System.out.println("直接引用静态方法"); filter(heros, TestLambda4::testHero); } public static boolean testHero(Hero h) { return 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.println(hero); } } } } ``` ## 步骤 2 : 引用对象方法 与引用静态方法很类似,只是传递方法的时候,需要一个对象的存在 ``` TestLambda testLambda = new TestLambda(); filter(heros, testLambda::testHero); ``` 这种方式叫做引用对象方法 ``` package lambda; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Random; public class TestLambda5 { 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 && damage<50的英雄"); HeroChecker c = new HeroChecker() { public boolean test(Hero h) { return h.hp > 100 && h.damage < 50; } }; //使用类的对象方法 TestLambda5 testLambda = new TestLambda5(); filter(heros, testLambda::testHero); } public boolean testHero(Hero h) { return 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.println(hero); } } } } ``` ## 步骤 3 : 引用容器中的对象的方法 首先为Hero添加一个方法 ``` public boolean matched(){ return this.hp>100 && this.damage<50; } ``` 使用Lambda表达式 ``` filter(heros,h-> h.hp>100 && h.damage<50 ); ``` 在Lambda表达式中调用容器中的对象Hero的方法matched ``` filter(heros,h-> h.matched() ); ``` matched恰好就是容器中的对象Hero的方法,那就可以进一步改写为 ``` filter(heros, Hero::matched); ``` 这种方式就叫做引用容器中的对象的方法 ``` package lambda; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Random; public class TestLambda6 { 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 && damage<50的英雄"); HeroChecker c = new HeroChecker() { public boolean test(Hero h) { return h.hp > 100 && h.damage < 50; } }; System.out.println("Lambda表达式:"); filter(heros, h -> h.hp > 100 && h.damage < 50); System.out.println("Lambda表达式中调用容器中的对象的matched方法:"); filter(heros, h -> h.matched()); System.out.println("引用容器中对象的方法 之过滤结果:"); filter(heros, Hero::matched); } public boolean testHero(Hero h) { return 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.println(hero); } } } } ```