Lambda

  • Lambda

1 .标准格式

  • 格式:(形式参数)->(代码块)
  • 形式参数:如果有多个参数,参数之间用逗号隔开,如果没有参数,留空即可
  • -> :由英文中划线和大于符号组成,固定写法,代表指向动作
  • 代码块:是我们具体要做的事情,也就是我们之前写的方法体内容

2.练习

1.前提

  • 有一个接口
  • 接口中有且只有一个抽象方法
  • 必须有上下文环境 才能推出Lambda对应的接口

2,练习

练习一

  • 首先有一个接口

    package test3;
    
    public interface Etable {
        void eat();
    }
    
  • 有一个实现此接口的类

  • package test3;
    
    public class Genericimp implements Etable{
        @Override
        public void eat(){
            System.out.println("实现eat方法");
        }
    
    }
    
  • 有一个主类

  • package test3;
    
    public class test3{
        public static void main(String[] args) {
            //正常使用
            Etable e=new Genericimp();
            useEtable(e);
    
            //匿名内部类
            useEtable(new Etable() {
                @Override
                public void eat() {
                    System.out.println("实现eat方法");
                }
            });
    
            //Lmabda表达式
            useEtable(()->{
                System.out.println("实现eat方法");
            });
        }
    
        public static void useEtable(Etable e){
            e.eat();
        }
    }
    
练习二

带参数的Lambda

  • 一个接口

  • package test4;
    
    public interface test1 {
        int add(int a,int b);
    }
    
    
  • 实现这个接口的类

  • package test4;
    
    public class test2 implements test1{
         @Override
         public int add(int a, int b){
             return a+b;
         }
    }
    
  • 主类

  • package test4;
    
    public class test4 {
        public static void main(String[] args) {
            test2 t1=new test2();
            adduse(t1);
    
            adduse(new test1() {
                @Override
                public int add(int a,int b) {
                    return 1+1;
                }
            });
    
    
            adduse((int a,int b)->{
                return 1;
            });
        }
    
        public static void adduse(test1 t){
            System.out.println(t.add(1,2));
        }
    }
    
  • 个人认为 匿名内部类的方法实际上就是对接口方法的重写,Lambda的重写得更简便

  • Lambda中的参数类型可以省略,一个小括弧中要么不省略,要么全部省略

  • adduse((a,b)->{
        return 1+2;
    });
    
  • 如果只有一个参数,那么小括号可以不写

  • useEtable(s-> {
        System.out.println(s+" 3实现fly方法");
    });
    
  • 代码块 如果只有一句可以省略大括号和分号。但是如果代码块中有return语句 return也要省略。

  • adduse((int a,int b)-> 1+2);
    adduse((int a,int b)->return 1+2 );//报错 不能有return
    

##3.Lambda与匿名内部类的区别

  • 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类

  • Lambda表达式:只能是接口,而且这个接口这能有一个方法

  • 匿名内部类:在编译后,会产生一个单独的.class字节码文件

  • Lambda表达式:编译后,没有一个单独的.class字节码文件。对应的字节码文件会在运行市动态生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值