引言
Old,Young
知识点总结
Lambda表达式
函数式编程思想
与面向对象编程思想不同的是,函数式编程思想的中心思想是“做什么,而不是怎么做”;而面向对象编程无论做什么都要先创建一个对象;基于函数式编程的这一特性,Lambda表达式就因此诞生了。
Lambda表达式的格式
先以创建一个打印一句话的线程为例,来说明Lambda表达式。
public class MyThread1{
public static void main(String[] args) {
//用匿名内部类创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程创建成功");
}
}).start();
//用Lambda表达式简化
new Thread(
()->{System.out.println(Thread.currentThread().getName()+"线程创建成功");}
).start();
}
}
我们可以看到,我们创建的线程就是为了打印一段话,而用匿名内部类会多出许多的无用代码;
Lambda表示式
() -> {}
1. () 代表参数列表
2. -> 用于传递
3. {} 中是要执行的任务
Lambda表达式练习
1.无参无返回值的情况
题目
代码实现
public class Demo02 {
public static void main(String[] args) {
invokeCook(new Cook() {
@Override
public void makefood() {
System.out.println("吃饭了");
}
});
//匿名内部类
System.out.println("====================");
//lambda表达式
invokeCook(()->{
System.out.println("吃饭了");
});
}
public static void invokeCook(Cook cook){
cook.makefood();
}
}
2.对人按年龄排序
代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
class Person{
public int age;
public String name;
public Person(String name,int age){
this.age=age;
this.name=name;
}
@Override
public String toString(){
return "[姓名="+this.name+",年龄="+this.age+"]";
}
}
public class Demo03 {
public static void main(String[] args) {
Person[] arr= {
new Person("高冷",10),
new Person("刘岩",18),
new Person("敬汉卿",20)
};
//匿名内部类
// Arrays.sort(arr, new Comparator<Person>() {
// @Override
// public int compare(Person o1, Person o2) {
// return o1.age-o2.age;
// }
// });
//lambda表达式
Arrays.sort(arr,(Person o1,Person o2)->{ return o1.age-o2.age; });
for(Person p:arr){
System.out.println(p);
}
}
}
Lambda省略格式
Lambda表达式是可推导的,因此可以省略部分内容;
可推导是指能够根据前后语段推导出来这部分的内容。
省略格式
- ()参数列表中的数据类型可不写;
- ()参数列表中有且仅有一个参数时,()和数据类型都可不写;
- {…}中只有一段代码时,{return , 分号,{} }都可不写;
Arrays.sort(arr,(Person o1,Person o2)->{ return o1.age-o2.age; });
//这两个效果是一样的;
Arrays.sort(arr,(o1,o2)->o1.age-o2.age);
Lambda表达式使用条件
必须要有接口,且接口得是函数式接口;所谓函数式接口就是有且仅有一个抽象方法需要被重写的接口。