Lambda表达式
yi使用之前的写多线程程序中,为了创建一个Thread对象,要先创建一个Runable实现类的对象,为此还要先创建一个Runable接口的实现类(或者使用匿名内部类),重写run方法,但是所有的工作中,最重要的就是run方法里的线程任务,其他的都是不得已而为之,我们不想创建什么实现类,创建什么匿名内部类,只希望run方法里的方法体可以执行,Lambda表达式可以简化这些操作。
使用前提:
1、必须有接口
2、接口必须只有一个抽象方法(这样才知道到底是重写哪一个方法)
package cn.zhuobo.day12.lambda;
public class Demo01Lambda {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " new thread task");
}
}).start();
// 使用Lambda表达式改写上面的代码
new Thread(() ->{
System.out.println(Thread.currentThread().getName() + " new thread task");
System.out.println("hahah");
}
).start();
}
}
Lambda表达式的标准格式:
有三部分组成:一些参数,一个箭头,一段代码
格式:
(参数) -> {一段重写代码}
一些参数:抽象方法中的参数列表,没有就空着,有多个就用逗号分割
一个箭头:表示把参数传递个方法体{},也就是花括号里的代码
一段重写的代码:花括号里的包括重写接口的方法的方法体
Lambda表达式的演示:无参数
package cn.zhuobo.day12.lambda;
public class CookMain {
public static void main(String[] args) {
// 这是之前的写法,method方法要使用Cook的对象作为参数,那就在参数列表里创建一个匿名内部类,并且重写Cook接口的makeFood方法
method(new Cook() {
@Override
public void makeFood() {
System.out.println("make a pizza");
}
});
// 使用Lambda表达式一样可以调用这个方法,不用创匿名内部类
method(() -> {
System.out.println("make a pizza");
});
}
public static void method(Cook cook) {
cook.makeFood();
}
}
Lambda表达式的演示:有参数
对Person数组排序
package cn.zhuobo.day12.lambda;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
public class PersonMain {
public static void main(String[] args) {
Person[] people = {new Person("aaa", 12),
new Person("bbb", 11),
new Person("ccc", 10)};
// 重写Comparator接口的compare方法
Arrays.sort(people, new Comparator<Person>() {// sort方法的参数是一个接口,可以创建匿名内部类
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();// 年龄升序
}
});
// 使用Lambda表达式,简化穿件匿名内部类
Arrays.sort(people,(Person o1, Person o2) -> {// 括号的参数的上面要重写的方法的参数列表
return o2.getAge() - o1.getAge();// 年龄降序
});
for (Person person : people) {
System.out.println(person);
}
}
}