1.背景
在JDK8.0中,JVM新增加了一个代码语法功能:Lambda表达式,其实质是希腊第十一个字母“λ”。由于在Java的实际项目开发中,很多时候根据设计模式的不同,大多选择的是遵循面向接口去创建的原则,所以,Lambda也是专门被用于在某些设计模式中简化代码的一个重要途径。
2.条件约束
Lambda表达式针对的是函数式接口。函数式接口指的是只包含一个抽象方法的接口,换句话说,该接口代表的就是这种方法。例如run()方法就是Runnable接口中唯一的抽象方法。可以设想以下,假如你有多个类都需要实现同一个函数式接口,说是实现接口,可该接口又只有一个类,说来说去也只是相对于多态的意思。若是普通做法,这时你一一创建多个类去实现该接口,并且一一创建类对象才能实现调用,非常麻烦。而Lambda,便是做到了免去了多个类创建的麻烦(同时匿名),实现接口并同时可以调用其中方法的过程
3.表达式
一般常用的lambda表达式子分为以下几种情况:
//实现Runnable接口
//普通实现接口方法:
class Test1 implements Runnable{
public void run(){
System.out.println("我是普通创建方法!");
}
public static void main(String[] args){
//第一种操作
Test1 test1=new Test();
new Thread(test).start();//创建实现类对象,抛入Thread构造器中,并启动线程;
//第二种操作:Lambda表达式(这边线程类Thread是已经实现了Runnable接口了的)
new Thread(()->{System.out.println("我是Lambda创建方法!");}).start();
//上述等价于:
new Thread(new Runnable() {
public void run() {
System.out.println("i am method1!!");
}
}).start();
}
}
上面是线程类的,若没有学过多线程可能会难以理解;
还有下述这种通用的面向函数式接口的实现:
interface Ilike{
public void lambda(String a);
}
public class Lamda2 implements Ilike {
public void lambda(String a) {
System.out.println("i am lambda1!!");
}//普通重写Run方法(在类中重写)
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一种
Ilike like=(a)->System.out.println("i am lambda2!");//Lambda表达式,实现并同时调用
//第二种
Ilike like2=new Lamda2();//创建实现类对象
like2.lambda("i am lambda3!");//调用方法
like.lambda("2");
}
}
通过比较,可以看出lambda表达式进行了大量的代码简化,也能用于优化匿名内部类、局部内部类。
3.总结
优点:
(1)避免匿名内部类定义过多
(2)可以让代码看起来更简洁
(3)去掉了一堆没有意义的代码,只留下核心的逻辑
本质:
(1)创建函数式接口对象并通过接口对象实现接口方法并调用的简洁方法。