介绍
Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。这是百度百科的定义,下面我们看下Lambda到底是怎么使用的。
Java8
及之后的版本才支持Lambda表达式
Lambda表达式的语法
Lambda表达式由3部分组成:
- 参数
- 箭头
- 代码块
格式:
(参数列表)->{代码块}
解释说明:
- ()传入需要传递的参数,没有可以空着,多个参数要用逗号分隔开。
- ->将参数传递给方法体{}。
- {}重写抽象方法的方法体。
案例
经典案例
传统写法:
public class MainDemo1 {
public static void main(String[] args) {
// 匿名内部类
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("多线程任务执行!");
}
};
new Thread(task).start(); // 启动线程
}
}
Lambda写法:
public class MainDemo2 {
public static void main(String[] args) {
// 匿名内部类
Runnable task = ()-> {
System.out.println("多线程任务执行!");
};
new Thread(task).start(); // 启动线程
}
}
无参无返回值
/**
* 定义一个厨师Cook接口,内部只有一个无参数、无返回值的makeFood方法
* 使用Lambda的标准调用invokeCook方法,打印"饭煮好了!!!"
*/
public interface Cook {
void makeFood();
}
public class CookDemo {
public static void main(String[] args) {
// 1.传统写法
invokeCook(new Cook() {
@Override
public void makeFood() {
System.out.println("饭煮好了!!!");
}
});
// 2.Lambda写法
invokeCook(()->{
System.out.println("饭煮好了!!!");
});
}
public static void invokeCook(Cook cook) {
cook.makeFood();
}
}
有参有返回值
public class Person {
String name;
int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class LambdaDemo {
public static void main(String[] args) {
// 用数组存储多个Person对象
Person[] arr = {
new Person("李冰冰", 30),
new Person("迪丽热巴", 18),
new Person("杨幂", 20),
};
// 1.传统写法
// 使用Arrays.sort()对Person对象的年龄进行升序排序(前面-后面)
/*
Arrays.sort(arr, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
*/
// 2.Lambda表达式简化匿名内部类
Arrays.sort(arr, (Person o1, Person o2) -> {
return o1.getAge() - o2.getAge();
});
// 遍历数组
for (Person person : arr) {
System.out.println(person);
}
// 输出结果
// Person{name='迪丽热巴', age=18}
// Person{name='杨幂', age=20}
// Person{name='李冰冰', age=30}
}
}
Lambda表达式的优缺点
优点
- 简洁,代码量减少
缺点
- 可读性比较差
- 调试不方便
- 只能用在只有一个方法的接口中,局限性大