package lam02;
public interface addAble {
int add(int a,int b );
}
package lam02;
public interface flyAble {
void fly(String str);
}
package lam02;
import lam01.flyAble;
/**
* Lambda表达式的省略模式
* 省略规则
* 1:参数类型可以省略,但是有多个参数的情况下,不能只省略一个
* 2:如果参数有且仅有一个,那么小括号可以省略
* 3:如果代码块的语句只有一条,可以省略大括号和分号,甚至return
*
* 注意事项
* 1:使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法
* 2:必须有上下文环境,才能推导出Lambda对应的接口
* 根据局部变量的赋值得知Lambda对应的接口:Runnable r = ()->System.out.println("Lambda表达式");
* 根据调用方法的参数得知Lambda对应的接口:new Thread(()->System.out.println("Lambda表达式"));
*
* 匿名内部类和Lambda的区别
* 一、所需类型不同
* 1:匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
* 2:Lambda表达式:只能是接口
* 二、使用限制不同
* 1:如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
* 2:如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
* 三、实现原理不同
* 1:匿名内部类:编译之后会产生一个单独的.class字节码文件
* 2:Lambda表达式:编译只有没有一个单独的.class字节码文件,对应的字节码会在运行的时候动态生成
*/
public class addAbleDemo {
public static void main(String[] args) {
useAdd((int a,int y)->{
//interface中add方法具体实现
return a +y;
});
//参数类型可以省略 但是在多参数的情况下,不能只省略一个
useAdd((a,y)->{
return a +y;
});
canFly((String s)->{
System.out.println(s);
});
//如果参数只有一个 小括号也可以省略
canFly( s->{
System.out.println(s);
});
//如果代码块的语句只有一条,可以省略大括号和分号
canFly(s->System.out.println(s));
//如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉 不然报错
useAdd((a,b)->a+b);
//必须有上下文环境,才能推导出Lambda对应的接口
Thread thread =new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Lambda表达式");
}
});
Runnable r = ()->System.out.println("Lambda表达式");
new Thread(r).start();
new Thread(()->System.out.println("Lambda表达式"));
}
private static void useAdd(addAble a){
int sum = a.add(12,43);
System.out.println(sum);
}
private static void canFly(flyAble f){
f.fly("我要飞得更高!");
}
}