原因:
为了让代码更简洁,更优雅,优化程序。
Lambda表达式可以看做函数式编程的子集。
之前看过一位博主的写的一句便于理解的一种说法:
Lambda表达式,其实是一段可传递的代码。
它的本质是以类的身份,干方法的活。
博主:bravo1988
可以在知乎搜到他。
精辟!!!
例子:
public interface MyRunnable { void run(); }
public class ByTrain implements MyRunnable { @Override public void run() { System.out.println("去12306买了一张票"); System.out.println("坐火车..."); } }
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(); } } }
public class Demo { public static void main(String[] args) { new MyThread(new MyRunnable() { @Override public void run() { System.out.println("不用买票"); System.out.println("骑电瓶车..."); } }).start(); } }
这时候是通过对象的方式传递
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
的博客