基础及原理分析
一、 需求
- 我们越来越需要: 将行为进行参数化,在方法间进行传递。
- 但是JDK7 之前的世界:方法是不能够做为“一等公民”进行传递的(反射机制可以做到,但远没有达到目的)。
- 我们需要新的东西,来完成将“行为参数化”的使命(JDK5 完成了将“参数类型参数化”,JDK1时代完成“参数名称参数化”)!
二、实现的过程(原理):
1、规定了新型的语法来表示“方法对象”(实际它是一个接口的匿名内部类的实例)
lamdaObj=(Object obj,String str)->{
//处理逻辑
//return 数据
}
你目前可以理解为:这是实例化对象的又一种方法(语法糖)!
- 那么
lamdaObj
的类型是什么?
(1)JDK8并没有因此而引入新的类(实际上它引入一些新的类如:Predicate,但这并不是基于为lamda引入类型的需求)
(2)缔造者提出了一个新的概念“函数式接口”,并为此类接口引入了一个新的注解(@FunctionalInterface),以帮助编译器检查。这个接口只有一个抽象方法(JDK8中引入了默认方法,并不会影响它的定义),这样JDK8之前的如:Runnable,Callable,Comparable
等接口都有一个新别名,函数式接口!
(3) 这样我们可以用函数式接口去声明lamda,代码如下:
interface MyInterface{
boolean fn(Object obj,String str);
}
MyInterface lamdaObj=(Object obj,String str)->{
//处理逻辑
//return 数据
}
引起注意的是:
- MyInterface中fn方法名称并不重要了
- Object,String这两个参数类型是以省略的(编译器的自动推断功能)
最后代码可以做出如下的简化:
//型别推断
MyInterface lamdaObj=(obj,s)->true;
interface MyInterface{
boolean fn(Object obj,String str);
}
三、得出结论:
凡是声明为“函数式接口”类型的引用,我们都可以使用Lamda进行替换!
简单的测试例子:
public class Demo02 {
public static void main(String... args) {
//测试传入Lamda
method1((Object obj,String str)->true);
//测试返回
method2().fn(new Object(),"abc");
}
//传入Lamda
public static void method1(MyInterface myInterface){
myInterface.fn(new Object(),"abc");
}
//返回Lamda
public static MyInterface method2(){
return (Object obj,String str)->true;
}
interface MyInterface{
boolean fn(Object obj,String str);
}
}