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字节码文件。对应的字节码文件会在运行市动态生成