从Java8开始 sun公司推出了Lambda表达式 这是一种函数式编程思想。
什么是函数式编程思想呢?
面向对象的思想:
做一件事情,找一个能解决这个事情的对象,调用对象的方法来完成这件事情
函数式编程思想:
只要能够获取到结果,谁去做,怎么做的都不重要,也不去关注,函数式编程思想重视的是结果,不重视实现的过程。
Lambda表达式的使用前提:
1.使用Lambda表达必须具有接口,且要求接口中有且仅有一个抽象方法。无法是JDK内置的Runnable、
Comparator接口还是自定义的接口,只有当接口的抽象存在且唯一时才可以使用Lambda表达式
2.使用Lambda必须具有上下文推断
也就是方法的参数或局部变量类型必须为Lambda表达式对应的接口类型才能使用Lambda作为该接口的实例
备注:有且仅有一个抽象方法接口,称为“函数式接口”
使用格式:
Lambda表达式由三个部分组成:
1.一些参数
2.一个箭头
3.一段代码
格式:(参数列表)->{一些重写的代码}
解释说明格式:
():小括号里面是接口中抽象方法的参数列表,没有参数就空着,有参数就写出参数,多个参数使用逗号分隔
->:传递的意思,把参数传递给方法体{}里面使用
{}:重写接口的抽象方法的方法体
eg:
public class test{
public static void main(String[] args){
//使用匿名对象和匿名内部类来创建一个新线程 使用匿名内部类不用写实现接口类,但代码看起来很复杂
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+": 创建了");
}
}).start();
//使用匿名对象和Lambda表达式来创建一个新线程 从代码的角度来看,用Lambda表达式太爽了
//没有参数()里面空着就让它空着
new Thread(()->{
System.out.println(Thread.currentThread().getName()+": 创建了");
}
).start();
}
Lambda表达式更简便模式
凡是根据上下文推导出来的内容,都可以省略书写格式
1.(参数列表):括号中参数列表类型,可以省略不写
2.(参数列表):括号的参数如果只有一个,那么类型和()都可以省略
3.{一些重写的代码}:如果{}中代码只有一行,无论是否有返回值都可以省略 {} return 分号
注意:要省略{} return ,分号必须全都一起省略
eg:
package cn.heima.lambda_demo.demo03;
import java.util.*;
public class PersonDemo {
public static void main(String[] args) {
List<Person> list=new ArrayList<>();
list.add(new Person("张天爱",29));
list.add(new Person("佟丽娅",35));
list.add(new Person("古力娜扎",28));
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
for (Person p:list){
System.out.println(p);
}
System.out.println("================");
//有参数有返回值的接口使用Lambda表达式
Collections.sort(list, (Person o1, Person o2)->{
return o1.getAge()-o2.getAge();
});
System.out.println("================");
//最简便的Lambda表达式
Collections.sort(list, ( o1, o2)->o1.getAge()-o2.getAge() );
for (Person p:list){
System.out.println(p);
}
}
}