目录
- 1.Lambda 表达式概述
- 2.体验 Lambda 表达式
- 3.Lambda表达式的标准格式
- 4.使用 Lambda 表达式
- 5.Lambda 表达式的省略规则
- 6.Lambda 表达式与匿名内部类的区别
本文章的大部分笔记整理来自https://www.bilibili.com/video/BV12k4y1q73J?p=240
1.Lambda 表达式概述Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。
2.体验 Lambda 表达式(1)需求:
- 已知接口 Animal 中有一个抽象方法
eat()
; - 在测试类 AnimalTest 中定义
show(Animal an)
方法, 实现调用Animal#eat()
方法; - 并在 main 方法中, 调用
AnimalTest#show()
方法;
(2)代码实现
package jf_lambda;
//自定义接口
public interface Animal {
void eat();
}
package jf_lambda;
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("eat!");
}
}
package jf_lambda;
public class AnimalTest {
//实现调用Animal#eat()方法
public static void show(Animal animal){
animal.eat();
}
public static void main(String[] args) {
//在 main 方法中调用 AnimalTest#show() 方法
//方式一:创建对象继承接口 Animal,并实现 eat() 方法
show(new Cat());
//方式二:采用匿名内部类,体现的是面向对象的思想,即传入 Animal 接口的子类对象
show(new Animal() {
//重写抽象方法
@Override
public void eat() {
System.out.println("eat!");
}
});
//方式三:采用 Lambda 表达式,体现的是函数式编程思想
show(() -> {
System.out.println("eat!");
});
}
}
3.Lambda表达式的标准格式
(1)标准格式:(形式参数) -> {代码块}
(2)格式解释:
形式参数如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可->由英文中画线和大于符号组成,固定写法,代表指向动作代码块具体要做的事情,也就是以前我们写的方法体内容组成 Lambda 表达式的三要素:形式参数,箭头,代码块
(3)使用 Lambda 表达式的前提是有一个接口,且接口中有且仅有一个抽象方法。
4.使用 Lambda 表达式(1)无参无返回值的抽象方法
package jf_lambda;
public interface Eatable {
//无参无返回值的抽象方法
void eat();
}
package jf_lambda;
public class EatableTest {
public static void useEatable(Eatable eatable){
eatable.eat();
}
public static void main(String[] args) {
//将 Lambda 表达式当作方法的实参进行传递
useEatable(()->{
System.out.println("无参无返回值!");
System.out.println("eat!");
});
}
}
(2)有参无返回值的抽象方法
package jf_lambda;
public interface Flyable {
//有参无返回值的抽象方法
void fly(String s);
}
package jf_lambda;
public class FlyableTest {
public static void useFlyable(Flyable flyable){
flyable.fly("fly!");
}
public static void main(String[] args) {
useFlyable((String s)->{
System.out.println("有参无返回值的抽象方法。");
System.out.println("传入的参数为:" + s);
});
}
}
(3)有参有返回值的抽象方法
package jf_lambda;
//自定义接口,具有求和功能
public interface Addable {
int add(int a,int b);
}
package jf_lambda;
public class AddableTest {
public static void useAddable(Addable addable){
int sum = addable.add(10,20);
System.out.println(sum);
}
public static void main(String[] args) {
useAddable((int a, int b)->{
System.out.println("有参有返回值的抽象方法。");
return a + b;
});
}
}
5.Lambda 表达式的省略规则
(1)参数类型可以省略但是有多个参数的情况下,不能只省略一个。 (2)如果参数有且仅有一个,那么小括号可以省略。 (3)如果代码块的语句只有一条,可以省略大括号、分号以及 return 关键字。 示例代码如下:
package jf_lambda;
public class OmitModeTest {
public static void useEatable(Eatable eatable){
eatable.eat();
}
public static void useFlyable(Flyable flyable){
flyable.fly("fly!");
}
public static void useAddable(Addable addable){
int sum = addable.add(10,20);
System.out.println(sum);
}
public static void main(String[] args) {
//按照上述的三条省略规则对Lambda表达式进行简写
useEatable(() -> System.out.println("eat!"));
useFlyable(s -> System.out.println("传入的参数为:"+s));
useAddable((a,b)->a+b);
}
}
6.Lambda 表达式与匿名内部类的区别
Lambda表达式匿名内部类所需类型只能是接口可以是接口、抽象类或者具体类使用限制如果接口中有且仅有一个抽象方法,Lambda 表达式和匿名内部类都可以使用如果接口中有多个抽象方法,只能使用匿名内部类实现原理编译之后,没有单独的 .class 字节码文件,它会在运行的时候动态生成编译之后,会产生一个单独的 .class 字节码文件