Closure闭包 Lambda和Monad

                   
banq 13-12-11



主要从Java8谈这三者区别,如果不想看下面废话,猛戳标题进入正题。

我对闭包的了解是从javascript闭包开始,当时以为只是一个编程技巧或模式而已,直至我进入了函数编程后,才开始认真再次研究闭包,并且试图搞清楚闭包和Lambda的区别。

其实闭包或Lambda在事件驱动编程,或者称为并发编程,异步编程中很有用,Lambda+事件驱动=reactive编程。

比如我们经常使用下面匿名函数实现回调功能,也就是事件的响应,事件有生产者和消费者,我们现在将应用逻辑都放在消费者实现,这样可以利用多线程并发原理,生产者是一个线程,消费者是一个线程,这样在消费者中执行的应用逻辑不会堵塞影响生产者中执行。这里非常类似观察者模式,代码如下:

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(e.getName());
}
});

这里是事件消费者或者称观察者监听者的代码,我们将这个观察者绑定到一个按钮button,当然我们可以监听观察任何可观察的对象,当这个被观察对象发生某个事件,它就是事件生产者,我们这个观察者就是事件消费者,执行我们的应用逻辑。

这种写法其实解决了一个异步等待结果的问题,在另外一个帖子:http://www.jdon.com/45898

public DataBus callServcie(DataBus databus) {
Future<DataBus> future=mThreadPool.submit(new AsyncThread(databus));
if(future!=null){
try {
return future.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
return null;
}

这里 future.get()会堵塞,我们应当将 future.get()放入一个观察者,实际上Future在java8中已经支持lambda的调用,我们就不会写这样堵塞顺序的代码。

使用匿名函数实现观察者的问题是笨重,会叠起高楼,使用lambda表达式替代匿名函数要更优雅简单。能够帮助我们在异步并发编程中更加方便,代码可读性更好。

1