一、lambda 原理理解
1、创建函数式接口
函数式接口:有且仅有一个抽象方法的接口
public interface OrderService {
void get();
}
2、由匿名内部类、逐步演化为lambda调用
//写法一
/**
*通过匿名内部类 构造
* new OrderService() 创建一个类对象,get()调用接口的方法
*/
new OrderService() {
@Override
public void get() {
System.out.println("被运行了1");
}
}.get();
//写法二
/**
*通过匿名内部类 构造
* new OrderService() 创建一个类对象orderService2,用创建的对象orderService2
* ,执行get()调用接口的方法
*/
OrderService orderService2 = new OrderService() {
@Override
public void get() {
System.out.println("被运行了2");
}
};
orderService2.get();
//写法三
/**
* ( OrderService)()-> System.out.println("被运行了3")
* ():默认匿名接口get()方法
* -> System.out.println("被运行了3"):给get() 方法赋值执行体内容
* ( OrderService) :强制转换为匿名对象
* (( OrderService)()-> System.out.println("被运行了3")): 创建的匿名对象
*
* .get(): 执行调用创建的匿名对象的get方法
*/
(( OrderService)()-> System.out.println("被运行了3")).get();
二 、测试java8 中的函数式接口
java8 提供的函数接口
https://www.runoob.com/java/java8-functional-interfaces.html
Supplier * 无参数,返回一个结果
Supplier 接口的定义如下
package java.util.function;
@FunctionalInterface
public interface Supplier<T> {
T get();
}
使用方式一
// T get() 是有返回结果T 的,所以return的是get 方法执行 返回的结果,(Supplier)()-> { ………… return xxxx}),是创建了Supplier 类型的接口对象
Supplier supplier= ((Supplier)()-> {
System.out.println("Supplier 运行成功!");
return new Integer(123);
});
//通过 supplier.get() 是通过创建的接口对象,执行get(),获取返回结果
System.out.println(supplier.get());
使用方式二
如果不知道怎么实现下面的匿名内部类方式,可以通过下面的ALT+ENTER 右键的方式 idea 自动提示实现匿名内部类的实现方式;
创建如下对象,返回的是 return 返回的数据类型,用 变量e 接受T get()返回的数据结果
Integer e= (Integer) new Supplier() {
@Override
public Object get() {
return new Integer(0);
}
}.get();
System.out.println(e);
综上所述,在目前的认知中 lambda表达式写法和以上通过匿名内部类的实现方式基本可以等价实现同样的功能,只不过是lambda写法更加简洁优雅;