你所做的事情,也许暂时看不到成果,你不是没有成长,而是在扎根
—— 24.6.19
一、函数式编程思想和Lambda表达式定义格式
1.面向对象思想:是Java的核心编程思想
强调的是找对象,帮我们做事儿
比如:去北京 -> 强调的是怎么去,火车,高铁,飞机,汽车,自行车,腿儿
2.jdk8开始有了个新的思想:函数式编程思想:
强调的是结果,不强调过程
比如:去北京->只强调去了还是没去
3.Lambda表达式
a、定义格式:()—>{}
b、各部分解释:
():重写方法的参数位置
—>:将参数传递到方法体中
{}:重写方法的方法体
public class Demo304Test01 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我执行了");
}
}).start();
System.out.println("————————————————————Lambda表达式——————————————————————");
new Thread(()-> {
System.out.println("我执行了");
}).start();
}
}
二、Lambda表达式使用前提
1.必须是函数式接口做方法参数传递
有且只有一个抽象方法的接口,用 @FunctionalInterface 去检测,就像@Override检测是否是重写方法
三、Lambda表达式省略规则
1.Lambda表达式怎么写
a.观察是否是函数式接口做方法参数传递
b.如果是,考虑使用Lambda表达式
c.调用方法,以匿名内部类的形式传递实参
d.从new接口开始到重写方法的方法名结束,选中,删除,别忘记再删除一个右半个大括号
e.在重写方法的参数后面,方法体的大括号前面加上 ->
/**
* a.观察是否是函数式接口做方法参数传递
* b.如果是,考虑使用Lambda表达式
* c.调用方法,以匿名内部类的形式传递实参
* d.从new接口开始到重写方法的方法名结束,选中,删除,别忘记再删除一个右半个大括号
* e.在重写方法的参数后面,方法体的大括号前面加上->
*/
public class Demo305Test02 {
public static void main(String[] args) {
method(new USB() {
@Override
public void open() {
System.out.println("USB打开了");
}
});
System.out.println("———————————————————————Lambda表达式————————————————————");
method(() -> {System.out.println("USB打开了");});
}
public static void method(USB usb){
usb.open();
}
}
2.省略规则:
a.重写方法的参数类型可以干掉
b.如果重写方法只有一个参数,所在的小括号可以干掉
c.如果方法体中只有一句话,那么所在的大括号以及分号可以干掉
d.如果方法体中只有一句话并且带return的,那么所在的大括号,分号以及return 可以干掉
package S107Lambda;
/**
* a.观察是否是函数式接口做方法参数传递
* b.如果是,考虑使用Lambda表达式
* c.调用方法,以匿名内部类的形式传递实参
* d.从new接口开始到重写方法的方法名结束,选中,删除,别忘记再删除一个右半个大括号
* e.在重写方法的参数后面,方法体的大括号前面加上->
*/
public class Demo305Test02 {
public static void main(String[] args) {
method(new USB() {
@Override
public void open() {
System.out.println("USB打开了");
}
});
System.out.println("———————————————————————Lambda表达式————————————————————");
/**
* 2.省略规则:
* a.重写方法的参数类型可以干掉
* b.如果重写方法只有一个参数,所在的小括号可以干掉
* c.如果方法体中只有一句话,那么所在的大括号以及分号可以干掉
* d.如果方法体中只有一句话并且带return的,那么所在的大括号,分号以及return 可以干掉
*/
method(() -> System.out.println("USB打开了"));
}
public static void method(USB usb){
usb.open();
}
}
package S107Lambda;
import java.util.ArrayList;
import java.util.Collections;
/**
* 2.省略规则:
* a.重写方法的参数类型可以干掉
* b.如果重写方法只有一个参数,所在的小括号可以干掉
* c.如果方法体中只有一句话,那么所在的大括号以及分号可以干掉
* d.如果方法体中只有一句话并且带return的,那么所在的大括号,分号以及return 可以干掉
*/
public class Demo306Test03 {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",10));
list.add(new Person("李四",8));
list.add(new Person("王五",9));
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()));
System.out.println(list);
}
}