scala中Either的一种使用场景
用scala有一年多了,对于scala中的Option和Try使用的较为频繁,对其应用场景相对熟悉一些。而对于Either,仔细回想一下却发现几乎(完全)没有使用过,其实并不是没有遇到过Either的使用场景,只是遇到的时候不知道能够使用Either来解决此问题。
昨天在网上偶然看到一篇介绍Either的文章,发现有一种场景可以使用Either来解决,具体是这样的:
web系统中,Controller层调用service层方法,根据邮箱查询注册的用户User,如果未取到User,则需要知道是什么原因导致的。
定义一个方法,根据登录邮箱查询User对象,方法签名如: def getUserByEmail(email:String):User
注意方法的返回值类型,这里返回的是User对象。在运行时会发生如下三种情况:
1、正常返回null
2、正常返回User
3、发生异常抛出Exception。
对于情况1,调用处如果想知道是为什么返回了null,是因为email的格式错误?还是因为该email没有注册的用户? 该种方法签名是没办法把失败原因返回给调用处的 。
那么我们考虑能否把返回结果类型User修改为Try[User],即:def getUserByEmail(email:String):Try[User]
对于刚才的情况1,如果是因为email格式不对,我们在方法体内可以封装一个Failure(RuntimeException("邮箱格式错误"))返回给调用处。而如果是该邮箱未注册,未查询到该用户,如果再封装一个Exception就不合适了。因为查不到用户属于正常的逻辑,不属于异常范畴,这种方式是不可取的。
那么我们再考虑把返回值类型Try[User]修改为Option[User],即:def getUserByEmail(email:String):Option[User]
这样,只是把把返回结果null修改为None,并未达到我们想要的目的
这时,我们就可以考虑把返回值类型修改为Either[String,User],即:def getUserByEmail(email:String):Either[String,User]。
如果查询到User,那么返回一个Right(user)即可,如果邮箱格式错误,则返回一个Left("邮箱格式错误"),如果该邮箱未进行注册,则返回Left("该邮箱未进行注册");如果运行中发生Exception,可以直接抛出,也可以封装为Left("发生XXX异常")返回给调用处。
除了通过Either来返回失败信息,我们也可以使用Tuple2[String,User]类型来实现想要的结果,在失败的时候返回Tuple2("失败原因描述",null),只是相对于Either来说,不是那么便捷。
使用方式可见如下伪代码:
@Test
def testEither(): Unit = {
getUserByEmail("xxx@sina.com") match {
case Right(user) => ???
case Left(msg) => println("查询用户失败,原因:" + msg)
}
} def getUserByEmail(email: String): Either[String, User] = {
if (email无效) {
return Left("邮箱格式错误")
} else {
if (未查询到注册邮箱) {
return Left("该用户不存在")
} else {
return Right(user)
}
}
}
=========================================
原文链接:scala中Either的一种使用场景
=========================================
-------end
scala中Either的一种使用场景的更多相关文章
- Scala中使用implict 扩展现有类的方法
Scala中implict的一种用法就是扩展现有类的方法,有点类似于.Net中的扩展方法(MS对扩展方法的介绍:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改 ...
- scala中“=>”的4种使用场景
一直以来都对scala中"=>"的使用比较迷茫,也不知道他表示什么意思.今天就它的使用场景列举如下,希望可以共同探讨. 表示函数的返回类型(Function Type) sc ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- Numpy中Meshgrid函数介绍及2种应用场景
近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法.但总觉得印象不深刻,不是太了解meshgrid的应用场景.所以,本文将进一步介绍Numpy中meshgrid的用法 ...
- Scala中apply的用法
Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...
- Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- scala函数定义的四种方式
最近开始接触scala编程语言,觉得还是比较新的一个东西,虽然说和java比较像,是java的继承者,兼顾面向对象编程和函数式编程的优点,但是,终究是一个新的东西,还是要从最基本的学起.而这当中,函数 ...
- Scala 中方法扩展实践
前言 这个名字不知道取得是否合适,简单来说要干的事情就是给某个类型添加一些扩展方法,此场景在各种语言中都会用到,比如 C# 语言,如果我们使用一个别人写好的类库,而又想给某个类库添加一些自己封装的方法 ...
- (转)scala中map与flatMap浅析
在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好 ...
随机推荐
- 常用且难记的一些css
1.多行文字超出隐藏,自动追加 ... 移动端兼容更好,pc下只能兼容 Safari.Opera 以及 Chrome 等部分浏览器,挺常用. (注:为什么要同时加这几个css不在这里详细叙述,详见) ...
- Vector的用法
vector容器是笔试时最经常用到的容器,它实际是一个类模板,它所具有一些成员函数我们必须熟练使用,这样才会加快编程速度. 首先加头文件并定义: #include<vector> vect ...
- jmeter 上传附件脚本报Non HTTP response code: java.io.FileNotFoundException
如果上传附件报如下错误,就需要把附件放到和脚本同一路径下就解决了
- spring查看生成的cglib代理类源码详解
1.让程序阻塞(抛出异常会导致程序结束,所以在抛出异常之前阻塞) 2. windows控制台 cd到jdk目录下的lib目录,找到sa-jdi.jar 执行: java -classpath sa-j ...
- Spring(转载一)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- javascript中使用"<"符号,比较大小的是字符串或对象时正确的处理方法
<![CDATA[ var items=document.getElementsByTagName("li"); for(var i=0;i<items.length; ...
- windows下配置下burpsuite的小方法。
1.下载破解版burpsuite和正版burpsuite. 2.安装正版burpsuite(免费版) 3.打开安装路径 4.把破解版的burp拷贝到安装路径下 5.该路径下应该有个burpsuite_ ...
- JavaScript 查找图中连接两点的所有路径算法
1.把图看成以起点为根节点的树 2.使用深度遍历算法遍历路径 3.遍历到节点为目标节点时,保存这条路径 find2PointsPath(sourceId, targetId) { const { no ...
- 自己用的Xshell配色方案
[comfort]text=dce2e2cyan(bold)=2ad1b8text(bold)=dce2e2magenta=dd3682green=55bb55green(bold)=55bb55ba ...
- 手机游戏引擎 Cocos
Cocos是全球最受欢迎的移动游戏开发解决方案,整合了Cocos 2d-x.Cocos 2d-js.Cocos Studio.Cocos Code IDE等框架及工具,无论您是开发新手还是行业资深人士 ...