一、 Why Lambda
原因:
为了让代码更简洁,更优雅,优化程序。
Lambda表达式可以看做函数式编程的子集。
之前看过一位博主的写的一句便于理解的一种说法:
Lambda表达式,其实是一段可传递的代码。
它的本质是以类的身份,干方法的活。
博主:bravo1988
可以在知乎搜到他。
精辟!!!
二、Lambda的一些特性
例子:
接口:
public interface MyRunnable {
void run();
}
实现类1
public class ByTrain implements MyRunnable {
@Override
public void run() {
System.out.println("去12306买了一张票");
System.out.println("坐火车...");
}
}
实现类2
public class ByAir implements MyRunnable {
@Override
public void run() {
System.out.println("在某App上订了飞机票");
System.out.println("坐飞机...");
}
}
调用类
public class MyThread {
// 成员变量
private MyRunnable target;
public MyThread() {}
// 构造方法,接收外部传递的出行策略
public MyThread(MyRunnable target) {
this.target = target;
}
// MyThread自己的run(),现在基本不用了
public void run() {
System.out.println("去12306买了一张票");
System.out.println("坐火车...");
}
// 如果外部传递了出行策略,就会调用该策略里的run()
public void start() {
if (target != null) {
target.run();
} else {
this.run();
}
}
}
匿名内部类启动类(Java8之前能做到的最好的优化)
public class Demo {
public static void main(String[] args) {
new MyThread(new MyRunnable() {
@Override
public void run() {
System.out.println("不用买票");
System.out.println("骑电瓶车...");
}
}).start();
}
}
这时候是通过对象的方式传递
Java8使用Lambda改善
public class Demo {
public static void main(String[] args) {
new MyThread(() -> {
System.out.println("不用买票");
System.out.println("骑电瓶车...");
}).start();
}
}
我们会发现new MyThread()这个构造方法原本需要传递一个MyRunnable接口的子类对象(匿名类对象),但我们扔一个Lambda表达式进去,它也接受了,这说明Lambda表达式在身份上与匿名类对象等价。
并且我们会发现传进去的lambda表达式中最后干活的是那个sout语句,而sout语句是在方法中(方法是对代码块的封装),所以说Lambda表达式在作用上与方法等价。
总结自:
知乎博主:bravo1988
的博客