Lambda表达式
Lambda好处:简化内部类的使用。
public static void main(String[] args) {
new OrderService() {
@Override
public void get() {
System.out.println("get");
}
}.get();
}
------------------
public static void main(String[] args) {
((OrderService) () -> System.out.println("get")).get();
}
调用接口使用匿名内部类重写方法
Lambda表达式需要函数接口的支持
函数接口定义:
1.在接口中只能有一个抽象方法
2.能够定义Object类中的方法
3.能够通过default修饰普通方法
4.@FunctionalInterface 标记为该接口为函数接口
标准格式
(参数类型 参数名称) -> { 代码体; }
//(参数类型 参数名称):参数列表
//{代码体;}:方法体
//-> :箭头,分隔参数列表和方法体
无参方法的时候lambda表达式
OrderService orderService = () -> {
System.out.println("使用lambda");
};
orderService.get();
参数方法的
public static void main(String[] args) {
OrderService2 orderService2 = (i, j) -> {
return i + "------" + j;
};
System.out.println(orderService2.get(7, 9));
}
精简版
public static void main(String[] args) {
OrderService2 orderService2 = (i, j) -> {
return i + "------" + j;
};
System.out.println(orderService2.get(7, 9));
//使用Lambda方法体中只有一条语句的情况下,在这时候我们不需要写(也可以不需要写return
String s = ((OrderService2) (i, j) -> i + "-----" + j).get(7, 7);
System.out.println(s);
}
实战案例
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("suran");
arrayList.add("xiaoguo");
arrayList.forEach((s)->{System.out.println(s);});
}
Lambda和匿名内部类使用上的区别
(1) 所需的类型不一样
匿名内部类,需要的类型可以是类,抽象类,接口
Lambda表达式,需要的类型必须是接口
(2)抽象方法的数量不一样
匿名内部类所需的接口中抽象方法的数量随意
Lambda表达式所需的接口只能有一个抽象方法
(3)实现原理不同
匿名内部类是在编译后会形成class
Lambda表达式是在程序运行的时候动态生成class