A.组成Lambda的三要素:形式参数,箭头(“->”),代码块
B.表达式格式:(形式参数) -> {代码块}
1.形式参数:如果有多个参数,参数之间用逗号隔开,如果没有参数留空即可
2."- >":固定写法,代表指向动作。
3.是我们具体要做的事情,也就是以前我们所写的方法体内容。
C.Lambda表达式使用的前提:
1.有一个接口
2.接口中仅有一个抽象方法
D.Lambda表达式的省略模式:
1.参数类型可省略,但是有多个参数的情况下,不能只省略一个。
2.如果参数有且仅有一个,那么小括号可以省略。
3.如果代码块的语句只有一条,可以省略大括号与分号,甚至是return
4.相关对应的代码块
package demo119;
/**
* @author ln
* @date 2022/1/19
* @description Lambda表达式的的省略模式
*/
public class AddableDemo {
public static void main(String[] args) {
//省略参数类型(有多个参数的话不能只剩部分)
useAddable((a,b) -> {
return a + b;
});
//省略参数类型(参数类型只有一个可以省略小括号,分号)
useFlyable(s ->{
System.out.println(s) ;
});
//省略参数类型(如果代码块的语句只有一条可以省略大括号和分号甚至return)
useAddable((x,y) -> x + y);
}
private static void useAddable(Addable a) {
int sum = a.add(10, 20);
System.out.println(sum);
}
private static void useFlyable(Flyable f) {
f.fly("风和日丽,清风万里");
}
}
package demo119;
/**
* @author ln
* @date 2022/1/19
* @description Lambda表达式的的省略模式
*/
public interface Addable {
public abstract int add(int x, int y);
}
package demo119;
/**
* @author ln
* @date 2022/1/19
* @description Lambda表达式的的省略模式
*/
public interface Flyable {
public abstract void fly(String s);
}
E.Lambda表达式的注意事项;
a.使用Lambda表达式必须有接口而且接口只能有一个抽象方法
b.必须有上下文环境才能推导出Lambda对应接口:
1.根据局部变量的赋值知Lambda对应的接口:Runnable r = () -> system.out.printlin("哈哈哈")
2.根据调用方法的参数得知Lambda对应的接口:new Thread(() -> system.out.printlin("哈哈哈")).start().
c.重点看第二种的代码
package demo119;
/**
* @author ln
* @date 2022/1/19
* @description Lambda表达式的注意事项
*/
public class LambdaDemo {
public static void main(String[] args) {
//注意事项1;接口能有一个抽象方法
useInter(() -> System.out.println("好好学习,天天向上。"));
//注意事项2,要有上下文环境
//局部变量的赋值
Inter r =(() -> System.out.println("今天不学习,明天变垃圾。"));
useInter(r);
//调用方法的参数
useInter(() -> System.out.println("今天不学习,明天变垃圾。"));
}
private static void useInter(Inter i) {
i.show();
}
}
F.Lambda表达式和匿名内部类的区别
a.所需类型不同:
1.匿名内部类可以是接口可以是抽象类,也可以式具体类
2.Lambda表达式只能是接口
b.使用限制不同:
1.如果接口中仅有一个抽象方法可以使用Lambda表达式,也可以使用匿名内部类
2.如果接口中多于有一个抽象方法,则只能使用匿名内部类
c.实现原理不同:
1.匿名内部类编译后产生一个单独的.class字节码文件
2.Lambda表达式编译后没有一个单独的.class字节码文件,对应的字节码会在运行时动态产生