发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

Closure闭包 Lambda和Monad

                   
2013-12-11 15:16
赞助商链接



主要从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
lambda      EDA事件驱动      异步编程      并发编程     

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com