博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala之美 - Future & map & flatMap
阅读量:6620 次
发布时间:2019-06-25

本文共 1481 字,大约阅读时间需要 4 分钟。

hot3.png

1. 介绍    

    Scala语言拥有很强的表达能力,语法简洁,很接近人类的思考方式。利用map、flatMap方法做数据转换时,层层递进的演算方式,很像是在画流程图,中间没有停顿,思绪很流畅,不会被无关的变量声明、初始化等琐事打断。Scala中的Future可以让你非常灵活的使用线程,而不需要关注底层的线程管理问题,Scala已经为你处理好一切。下面我们以一个示例来说明,将Future、map和flatMap组合起来会产生多大的威力!

2. 需求描述

    假设我们是一个VPS服务器提供商,现在考虑用户购买了VPS之后,要在控制台上执行创建磁盘快照的操作。系统需要执行的步骤如下:

    1)根据用户id和VPS id,到数据库中分别取出相应记录

    2)检查用户和VPS的状态,如果状态异常,返回报错信息

    3)向消息队列发送一条创建磁盘快照的消息,如果消息发送失败,返回报错信息

    4)执行过程中,如果有异常抛出,直接返回错误页面

    如果只有上面这四条需求,你是不是觉得也太简单了!好吧,下面重头戏来了,为了保证系统的高并发,我们还有第五条要求,

    5)所有的操作都要异步执行,不能阻塞当前处理请求的线程

    小伙伴们,如何实现,你想好了吗?

3. Scala实现

      既要异步执行,又要优雅地处理跨线程异常,看看Scala是如何处理的吧!

def doDiskSnapshot(uid: String, vpsId: String) = Action.async { implicit request => {    for {      Some(user) <- getCollection("user").find(Json.obj("_id" -> uid)).one[User]       Some(vps)  <- getCollection("vps").find(Json.obj("_id" -> vpsId)).one[Vps]     } yield {       if(!user.disabled && !vps.disabled){ true } else { false }     }   }.flatMap{ isValid =>     if(isValid){       getCollection("snapshot-task").insert(SnapshotTask(...)).map{ wr =>         if(wr.ok && wr.n == 1){           Ok("操作成功!")         } else {           Ok("操作失败!")         }       }     } else {       Future(Ok("很抱歉,您的操作已被系统拒绝!"))     }   }.recover{     case t =>      Ok("很抱歉,发生系统错误,请稍候重试!")   } }

    第3-4行:从数据库中取出用户和VPS记录

    第6行:   返回状态检查结果

    第8行:   数据传递

    第9行:   检查状态信息

    第10行: 发送消息

    第20行: 错误处理

    整个执行过程一气呵成,去掉方法声明一共22行代码,没有任何拖沓冗余的地方,让人不得不感叹Scala设计之精妙!

    好了,文章到此结束。感兴趣的同学可以猜猜看:假设线程池足够大,上面的代码一共用到了几个线程?答案会在后面公布。

转载于:https://my.oschina.net/joymufeng/blog/536184

你可能感兴趣的文章
第一章练习题
查看>>
三、JVM垃圾回收1(如何寻找垃圾?)
查看>>
RabbitMQ-从基础到实战(2)— 防止消息丢失
查看>>
【译】ExtJS 4.1会带来什么
查看>>
重要的话
查看>>
mysql多个TimeStamp设置(转)
查看>>
php中的占位符
查看>>
BSS段 data段 text段 堆heap 和 栈stack
查看>>
数据库创建好之后如何创建scott用户
查看>>
EBS销售订单挑库发放处理程序
查看>>
动态大小的图片上的超链接
查看>>
总结一下常用的排序,冒泡排序,选择排序,快速排序
查看>>
Sql Server系列:系统函数
查看>>
php5.5 yum源
查看>>
samsungGalaxyS4USB驱动
查看>>
SDN第三次作业
查看>>
java第二次实验作业
查看>>
PHP数据集构建JSON及新数组
查看>>
写一本书和找一本书
查看>>
hdu1010 Tempter of the Bone(DFS+剪枝)
查看>>