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
最新文章
- [转载]大型网站应用中 MySQL 的架构演变史
- eclipse中Maven运行时报错: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
- virtual和abstract
- CSS的压缩 方法与解压
- 准确理解SO_REUSEADDR
- leetcode 41 First Missing Positive ---java
- 非常不错的IT进阶站点
- CSS_网站配色参考方案
- Java使用泛型类来提高方法的可重用性
- iOS7 人机界面设计指南
- PHP一个最简单的CMS内容管理系统
- ArcGIS10.3.1于2015年6月发布
- 美版MC 使用
- shell [ff: 未找到命令
- oracle数据库常用的99条查询语句(转载)
- python input()键盘输入8583报文带有\x单反斜杠自动转义问题解决办法
- Django学习之一:Install Djongo 安装Djongo
- mysql性能排查思路
- Java学习之路-Hessian学习
- python 多版本管理pyenv和virtualenv虚拟开发环境
热门文章
- 查询MySQL数据库中表结构的几种方法
- CentOS 7 yum安装nginx-1.12.0
- vue实战 - 车牌号校验和银行校验
- javascript方法篇-String
- Springboot框架,实现请求数据解密,响应数据加密的功能。
- linux 修改配色
- Favorite Donut(HDU 5442)最小表示法+二分
- viewport定义,弹性布局,响应式布局及LESS和SASS框架应用
- [Java Web学习]Tomcat启动时报war exploded: Error during artifact deployment
- 使用bind提供域名解析服务