Lambda方法引用

  • 引用静态方法
    首先为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.List;
    import java.util.Random;
       
    import charactor.Hero;
       
    public class TestLambda {
        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);
               
            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 -> TestLambda.testHero(h) );
            System.out.println("直接引用静态方法");
            filter(heros, TestLambda::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.print(hero);
            }
        }
       
    }
  • 引用对象方法
    与引用静态方法很类似,只是传递方法的时候,需要一个对象的存在
     
    TestLambda testLambda = new TestLambda();
    filter(heros, testLambda::testHero);
     

    这种方式叫做引用对象方法

    package lambda;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    import charactor.Hero;
     
    public class TestLambda {
        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("使用引用对象方法  的过滤结果:");
            //使用类的对象方法
            TestLambda testLambda = new TestLambda();
            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.print(hero);
            }
        }
     
    }
  • 引用容器中的对象的方法
    首先为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.List;
    import java.util.Random;
       
    import charactor.Hero;
       
    public class TestLambda {
        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("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.print(hero);
            }
        }
       
    }
  • 引用构造器
    有的接口中的方法会返回一个对象,比如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);
    package lambda;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Supplier;
     
    public class TestLambda {
        public static void main(String[] args) {
        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);
     
        }
         
        public static List getList(Supplier<List> s){
            return s.get();
        }
          
    }







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值