一、Lambda表达式的标准格式
匿名内部类的方式实现run()方法代码分析:
- 方法的形式参数为空,说明调用方法时不需要传递参数
- 方法返回值类型为void,说明方法的执行没有结果返回
- 方法体中的内容,是我们具体要做的事情
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("多线程启动了");
}
})
Lambda的实现方式实现run()方法代码分析:
- ():里面没有内容,可以看成是方法形式参数为空
- ->:用箭头表示后面要做的事情
- {}:包含一段代码,我们称之为代码块,可以看作是方法体内的内容
new Thread(()->{
System.out.println("多线程启动了");
})
组成Lambda表达式的三要素:形式参数、箭头、代码块
Lambda表达式的格式:
- 格式:(形式参数)->{代码块}
- 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
- ->:由英文和大于符合组成,固定写法。代表指向动作。
- 代码块:是我们要具体要完成的事情。
二、Lambda表达式的练习
Lambda表达式使用的前提:
有一个接口
接口中有一个抽象方法且仅有一个抽象方法
练习1:没有形式参数以及返回类型的Lambda表达式练习
- 定义一个Eatable接口,里面定义一个抽象方法:void eat();
- 定义一个测试类EatableTest,在测试类中提供两个方法。一个是useEatable(Eatable e),一个主方法。
- Eatable接口:
public interface Eatable{
void eat();
}
- EatableTest测试类
public class EatableTest{
public static main(String[] args){
//Lambda表达式
useEatable(()->{
System.out.println("我很能吃!!!");
})
}
private static void useEatable(Eatable e){
e.eat();
}
}
练习2:带有参数,但是没有返回值的Lambda表达式练习
- 定义一个接口Study,里面定义一个抽象方法:void studyJava(String s);
- 定义一个测试类EatableTest,在测试类中提供两个方法。一个是useStudy(Study s),一个主方法。
- Study接口:
public interface Study{
void studyJava(String s);
}
- EatableTest测试类
public class EatableTest{
public static main(String[] args){
//Lambda表达式
useEatable((String s)->{
System.out.println(s);
})
}
private static void useStudy(Study s){
s.studyJava("java yyds");
}
}
练习3:带有参数,以及有返回值的Lambda表达式练习
- 定义一个接口Computer,里面定义一个抽象方法:int add(int x,int y);
- 定义一个测试类EatableTest,在测试类中提供两个方法。一个是useComputer(Computer c),一个主方法。
- Computer接口:
public interface Computer{
int add(int x,int y);
}
- EatableTest测试类
public class EatableTest{
public static main(String[] args){
//Lambda表达式
useComputer((int x,int y)->{
return x + y;
})
}
private static void useComputer(Study s){
int sum = s.add(2,3);
System.out.sum(sum);
}
}
三、Lambda表达式省略规则
- 参数类型可以省略,但是有多个参数的情况下,不能只省略一个。
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号以及分号,甚至是return也可以省略
四、Lambda表达式的注意事项
- 使用lambda表达式必须要有接口,并且要求接口中有且仅有一个抽象方法
- 必须要有上下文环境才能推导出Lambda对应的接口