- 标准格式:(形参)->{代码块}
- () 可以无参数,写参数的方式和方法里面的参数一样
- -> 用箭头指向后面要做的事情,固定写法
- {} 包含一段代码,我们称之为代码块,可以看成是方法体中的内容
- 简写方式
- 参数类型可以省略,但是若有多个参数,不能省略
- 如果只有一个参数,小括号可以省略
- 如果代码块只有一条语句,可以省略大括号和分号,甚至是return
- 注意事项:
- 使用Lambda必须有一个接口,接口中有且仅有一个抽象方法。
- 必须要有上下文环境,才能推导出Lambda对应的接口
- 根据局部变量赋值,得知Lambda对应的接口:Runnable =0->System.out.println(“Lambda表达式”);
- 根据调用方法的参数得知Lambda对应的接口:new Thread(()->System.out.println(“Lambda表达式”)).start();
- 和匿名内部类区别
- 所属类型不同
- 匿名内部类可以是接口也可以是抽象类,还可以是具体类
- Lambda只能是接口
- 使用限制不同
- 接口中如果有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类。
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成。
- 所属类型不同
例子 ```java public class Demo { public static void main(String[] args) {
//方式一
MyRunnable my = new MyRunnable() ;
Thread t1 = new Thread(my,"t1");
t1.start();
//方式二 匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多线程启动了");
}
}) .start();
//lambda表达式
new Thread(()-> System.out.println("多线程启动了")).start();
} }
public class MyRunnable implements Runnable{ @Override public void run(){ System.out.println(“多线程启动了”); } }
```java
/*
定义一个接口(Eatable),里面定义一个抽象的方法:void eat()
定义一个测试类,在测试类中提供两个方法:
一个方法是:useEatable
一个方法是主方法,在主方法中调用useEatable()方法
*/
public class Demo {
public static void main(String[] args) {
useEatable(()-> System.out.println("ssss"));
}
public static void useEatable(Eatable e){
e.eat();
}
}
************************************************************************************
public interface Eatable {
void eat() ;
}
/*
定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s)定义一个测试类,在测试类中提供两个方法:
一个方法是:useFlyable(Flyable f)
一个方法是主方法:在主方法中调用useFlyable
*/
public class Demo {
public static void main(String[] args) {
useFlyable((s)->{
System.out.println("ssssss");
System.out.println(s);});
}
public static void useFlyable(Flyable s){
s.fly("66666666666666");
}
}
**********************************************************************************
public interface Flyable {
void fly(String s) ;
}
/*
定义一个接口(addable),里面定义一个抽象方法:int add(int x,int y);
定义一个测试类,在测试类中提供两个方法:
一个方法是:useAddable(Addable a)
一个方法是主方法:在主方法中调用useAddable
*/
public class Demo {
public static void main(String[] args) {
useAddable((int s1,int s2)-> s1+s2 );
}
public static void useAddable(Addable s){
int i = s.add(5,6);
System.out.println(i);
}
}
************************************************************************************
public interface Addable {
int add(int x,int y) ;
}