函数式编程思想:只要能获取到结果,不关注怎么做
由匿名内部类简化而来
(参数列表)-> {一些重写方法的代码 } 中间的箭头表示将前面的参数传递给后面的代码
- ():接口中抽象方法的参数列表,没有参数就空着
- ->:中间的箭头表示将前面的参数传递给后面的代码
- { } : 重写接口的抽象方法体
- 无参数返回值
public interface Cook {
// 无参数无返回值的方法makeFood
public abstract void makeFood();
}
==================================================
public class DemoLamda {
public static void main(String[] args) {
// 调用invokeCook方法,参数是接口,可以传递匿名内部类
invokeCook(new Cook(){
@Override
public void makeFood() {
System.out.println("吃饭了");
}
});
// 使用Lambda标准格式(无参数返回),简化匿名内部类
invokeCook(()->{
System.out.println("吃饭了");
});
// 优化省略
invokeCook(()->System.out.println("吃饭了"));
}
// 定义一个方法,参数为Cook接口,内部调用Cook的方法
public static void invokeCook(Cook cook){
cook.makeFood();
}
}
- 有参数与返回值
import java.util.Arrays;
import java.util.Comparator;
public class Demolambda01 {
public static void main(String[] args) {
Person[] arr = {
new Person("wudide1", 25),
new Person("wudide2", 324),
new Person("wudide3", 35),
};
// 对数字进行排序,传递一个比较器
// Arrays.sort(arr, new Comparator<Person>() {
// @Override
// public int compare(Person o1, Person o2) {
// return o1.getAge()-o2.getAge();
// }
// });
// 使用Lambda表达式,简化匿名内部类
Arrays.sort(arr,(Person o1,Person o2)->{
return o1.getAge()-o2.getAge();
});
// 省略格式
Arrays.sort(arr,(o1,o2)->o1.getAge()-o2.getAge());
for (Person p : arr) {
System.out.println(p);
}
}
}
-
更加精简
凡是可以根据上下文推导出的内容,可以省略
可以省略的内容:
- 括号中参数列表的数据类型,可以省略
- 括号中的参数,如果只有一个,类型和括号都可以省略
- 如果大括号的代码只有一行,无论是否有返回值,都可以省略 :{ } return 分号 (必须三个一起省略)
-
Lambda使用前提:
使用Lambda必须具有接口,且要求接口有且仅有一个抽象方法(函数式接口)
必须就有上下文推断