1:Lambda表达式概述
什么是Lambda表达式?
可以将Lambda表达式理解为一个匿名函数; Lambda表达式允许将一个函数作为另外一个函数的参数; 我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),也可以理解为函数式编程,将一个函数作为参数进行传递。
Lambda表达式可以显著提高我们的编程效率
2:Lambda的具体使用
//实现类的方式的实现需求
MyRunnable my = new MyRunnable();
Thread t = new Thread(my);
t.start();
//使用匿名内部类的方法改进
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多线程程序启动了");
}
}).start();
//Lambda表达式改进
new Thread(()->{
System.out.println("jinitaimei");
}).start();
是不是很妙?上诉代码是为了实现Runnable,如果使用常规的方法改进,就得使用匿名内部类的方式改进,但如果使用Lambda表达式,则大幅度简化了所需的代码数,且更易理解。
3:详解
Lambda表达式的格式
格式:(形式参数) -> {代码块}
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可。
->:由英文中画线和大于符号组成,固定写法。代表指向动作
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
4:Lambda表达式的省略模式
省略规则:
①参数类型可以省略。但是有多个参数的情况下,不能只省略一个
②如果参数有且仅有一个,那么小括号可以省略
③如果代码块的语句只有一条,可以省略大括号和分号,甚至是return
useix((int x,int y)->{
// return x+y;
return x-y;
});
//类型的省略
useix((x,y)->{
return x+y;
});
//
useflyable(s -> {
System.out.println(s);
});
// 参数有且只有一个大括号和分号
useflyable(s -> System.out.println(s));
//如果有return,return也要省略掉
useix((x,y)->x+y);
}
private static void useix (ix a){
int sum=a.add(10,36);
System.out.println(sum);
}
private static void useflyable(ip s) {
s.fly("风和日丽");
}
5:Lambda表达式的注意事项
注意事项:
①使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法
②必须有上下文环境,才能推导出Lambda对应的接口
public static void main(String[] args) {
//
useinter(() ->
System.out.println("jinitaimei"));
// 必须有上下文环境,才能推到出Lambda对应的接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类");
}
}).start();
}
private static void useinter(inter i) {
i.show();
}
}
//使用lambda必须要有接口,并且要求接口中有且只有一个抽象方法
6:Lambda表达式和匿名内部类的区别
- 所需类型不同
1:匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
2:Lambda表达式:只能是接口
- 使用限制不同
1:如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
2:如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
1:匿名内部类:编译之后,产生一个单独的.class字节码文件
2:Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成