Lambda表达式支持将代码块作为方法参数, 允许使用更为简洁的方式实现抽象类或接口的抽象方法, 而不再是通过匿名内部类的方式, 它具有对某一方法重写或实现的功能;
接下来通过一个简单的例子了解一下
public class LambaExpressionDemo {
public void eat(Eatable e) {
// System.out.println(e);
e.taste();
}
public static void main(String[] args) {
LambaExpressionDemo LED=new LambaExpressionDemo();
//方式1:通过匿名内部类的方式实现Eatable接口的taste方法
LED.eat(new Eatable() {
@Override
public void taste() {
System.out.println("nice1");//匿名内部类重写taste方法
}
});
//方式2: 通过Lambda表达式
LED.eat(()->{System.out.println("nice2");});
}
}
interface Eatable{
void taste();
}
Lambda表达式只有一条语句,就可以省略大括号, 如上可写为: LED.eat( ()->System.out.println(“nice2”); );
上述代码中"->“前面的括号里的对应的就是需要重写接口方法的形参(即 taste() 括号中的 ), 后面”{}"中的对应的就是接口或抽象类的实现方法体, 若表达式需要返回值, return语句可以省略, 其实表达式在重写完抽象类/接口方法后返回重写后的匿名对象, 即使你没写return语句
Lambda只能为函数是接口创建对象 ( Lambda表达式最大的作用就是简化匿名表达式new …的操作 )
在Lambda表达式最前面可添加强制类型转换, 通过Lambda表达式返回匿名对象, 可对匿名对象向上/向下转型实现多态效果
Lambda的引用类方法
由于Lambda返回的是一个匿名对象, 其效果与匿名内部类的效果相同, 所以可对返回值进行引用操作
如上代码可进行改写:
Eatable eatable=()->{ System.out.println("nice3"); };
eatable.taste();
//使用接口的引用变量接收Lambda表达式的返回值, 再次通过接口的引用变量调用接口的实现方法
引用特定对象的实例方法
就是在"->"后面的重写的代码块中采用其他对象调用特定的方法
Eatable eatable=()->{ System.out.println("nice3"); A.functionName };
//通过特定对象A, 调用实例方法
eatable.taste();
引用某类对象的实例方法以及引用构造方法: 不做阐述, 与上面操作大致相同, 就是实现抽象类/接口的抽象方法(在"->"后面做相应的操作)
通过上述的操作发现Lambda表达式与匿名内部类具有一定的联系:
他们二者的区别是:
最后再重复一遍
Lambda式子中,"->“前面的是需要实现的抽象方法的形参,没有形参就”()"为空处理,后面的是实现抽象方法的方法体