主要从Java8谈这三者区别,如果不想看下面废话,猛戳标题进入正题。
我对闭包的了解是从javascript闭包开始,当时以为只是一个编程技巧或模式而已,直至我进入了函数编程后,才开始认真再次研究闭包,并且试图搞清楚闭包和Lambda的区别。
其实闭包或Lambda在事件驱动编程,或者称为并发编程,异步编程中很有用,Lambda+事件驱动=reactive编程。
比如我们经常使用下面匿名函数实现回调功能,也就是事件的响应,事件有生产者和消费者,我们现在将应用逻辑都放在消费者实现,这样可以利用多线程并发原理,生产者是一个线程,消费者是一个线程,这样在消费者中执行的应用逻辑不会堵塞影响生产者中执行。这里非常类似观察者模式,代码如下:
|
这里是事件消费者或者称观察者监听者的代码,我们将这个观察者绑定到一个按钮button,当然我们可以监听观察任何可观察的对象,当这个被观察对象发生某个事件,它就是事件生产者,我们这个观察者就是事件消费者,执行我们的应用逻辑。
这种写法其实解决了一个异步等待结果的问题,在另外一个帖子:http://www.jdon.com/45898
|
这里 future.get()会堵塞,我们应当将 future.get()放入一个观察者,实际上Future在java8中已经支持lambda的调用,我们就不会写这样堵塞顺序的代码。
使用匿名函数实现观察者的问题是笨重,会叠起高楼,使用lambda表达式替代匿名函数要更优雅简单。能够帮助我们在异步并发编程中更加方便,代码可读性更好。