我们先看以下线程的代码:
public class Test {
public static void main(String[] args) {
// 匿名内部类
Runnable task = new Runnable() {
@Override
public void run() { // 覆盖重写抽象方法
System.out.println("多线程任务执行!");
}
};
new Thread(task).start(); // 启动线程
}
}
使用Lambda表达式后的代码:
public class Test {
public static void main(String[] args) {
//Lambda表达式
new Thread(() -> System.out.println("多线程任务执行!")).start(); // 启动线程
}
}
两者执行的结果一样,可见Lambda表达式简化了非常多的代码。
我们在使用匿名内部类时,省去了类的定义,但是仍然存在代码冗余。
而Lambda表达式则进一步省略了匿名内部类的相关代码。
Lambda标准格式。
Lambda表达式的标准格式为:
(参数类型 参数名称) ‐> { 代码语句 }
格式说明:
练习:(无参)
定义一个接口Fly:
public interface Fly {
public void fly();
}
测试类:
public class Test {
public static void main(String[] args) {
//未使用Lambda
canFly(new Fly() {
@Override
public void fly() {
System.out.println("我飞了");
}
});
//使用Lambda
canFly(() -> System.out.println("我飞了"));
}
public static void canFly(Fly flyy){
flyy.fly();
}
}
Lambda的有参数和返回值:
题目需求:
定义Person类:
public class Person {
private String name;
private int 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;
}
}
传统写法:
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
// 本来年龄乱序的对象数组
Person[] array = {
new Person("古力娜扎", 19),
new Person("迪丽热巴", 18),
new Person("马尔扎哈", 20) };
// 匿名内部类
Comparator comp = new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
};
Arrays.sort(array, comp); // 第二个参数为排序规则,即Comparator接口实例
for (Person person : array) {
System.out.println(person);
}
}
}
代码分析:
因此,使用Lambda表达式需要传入两个参数,分别为Person o1, Person o2;返回值则是o1.getAge() ‐ o1.getAge();
Lambda表达式为:
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
// 本来年龄乱序的对象数组
Person[] array = {
new Person("古力娜扎", 19),
new Person("迪丽热巴", 18),
new Person("马尔扎哈", 20) };
//Lambda表达式
Arrays.sort(array,(Person o1, Person o2) -> {
return o1.getAge() - o2.getAge();
});
for (Person person : array) {
System.out.println(person);
}
}
}
Lambda的使用前提:
备注:有且仅有一个抽象方法的接口,称为“函数式接口