Lambda表达式的前提 - lambda表达式是对 匿名内部类的简化书写格式
1.必须要有接口(函数式接口):
2该接口必须被覆盖重写的抽象方法-只能有一个,可以有默认方法,可以有静态方法
3必须有方法使用函数式接口作为方法参数
lambda表达式书写规则: (参数类型 参数名称) -> { 代码语句 }
小括号(): 就是以前定义方法的小括号,内部写的是方法参数列表 没有参数,也不能省略
使用匿名内部类的方式中,只保留覆盖重写后方法的()和{},在()和{}之间,添加->,其它全部省略
简化
1.数据类型可以省略: (Person p) 简化为 (p) (Person p1,Person p2) 简化为 (p1,p2)
2注意: 没有参数,()不能省略 ->: 永远不能省略
3.如果{}中只有一句话,那么{}和分号和return,全部可以省略
4Lambda表达式有参数有返回值 Arrays.sort(ps, new Comparator<T>() { }
参数T是引用类型,不能直接减
@Override: 检测子类方法是否是对父类方法的覆盖重写
@FunctionalInterface: 检测是否是函数是接口的
public interface MyFunctionalInter { }
public class Demo01Lambda {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程任务A执行了...");
}
}).start();
new Thread(()-> {
System.out.println("线程任务B执行了...");
}
).start();
}
}
Lambda表达式有参数有返回值
public class Demo03Lambda {
public static void main(String[] args) {
Person[] ps =
{new Person("张三",18),new Person("李四",38),new Person("王五",28)};
System.out.println("排序前: "+ Arrays.toString(ps));
Arrays.sort(ps, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
System.out.println("年龄从小到大排序后: "+ Arrays.toString(ps));
Arrays.sort(ps,(Person p1,Person p2)->{
return p2.getAge() - p1.getAge();
});
System.out.println("年龄从大到小排序后: "+ Arrays.toString(ps));
}
}
List集合存储多个Person对象,完成对List集合的排序,按照年龄排序
List<Person> list = new ArrayList<>();
Collections.sort(list,(Person p1,Person p2)->{
return p2.getAge() - p1.getAge();
});
fun(new MyFunctionalInter() {
@Override
public void method() {
System.out.println("匿名内部类的方式....");
}
});