用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的一种使用场景的更多相关文章

  1. Scala中使用implict 扩展现有类的方法

    Scala中implict的一种用法就是扩展现有类的方法,有点类似于.Net中的扩展方法(MS对扩展方法的介绍:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改 ...

  2. scala中“=>”的4种使用场景

    一直以来都对scala中"=>"的使用比较迷茫,也不知道他表示什么意思.今天就它的使用场景列举如下,希望可以共同探讨. 表示函数的返回类型(Function Type) sc ...

  3. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  4. Numpy中Meshgrid函数介绍及2种应用场景

    近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法.但总觉得印象不深刻,不是太了解meshgrid的应用场景.所以,本文将进一步介绍Numpy中meshgrid的用法 ...

  5. Scala中apply的用法

    Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...

  6. Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  7. scala函数定义的四种方式

    最近开始接触scala编程语言,觉得还是比较新的一个东西,虽然说和java比较像,是java的继承者,兼顾面向对象编程和函数式编程的优点,但是,终究是一个新的东西,还是要从最基本的学起.而这当中,函数 ...

  8. Scala 中方法扩展实践

    前言 这个名字不知道取得是否合适,简单来说要干的事情就是给某个类型添加一些扩展方法,此场景在各种语言中都会用到,比如 C# 语言,如果我们使用一个别人写好的类库,而又想给某个类库添加一些自己封装的方法 ...

  9. (转)scala中map与flatMap浅析

    在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好 ...

随机推荐

  1. Javascript 严格模式(strict mode)详解

    Javascript 严格模式详解   一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Ja ...

  2. linux rar文件解压命令

    解压命令: unrar x demo.rar

  3. 记一次H5页面卡死的BUG

    之前有次开发小程序内嵌页面,类似于网易星球那种,很多钻石可以手动点击收取. 该页面css动效非常多,几乎页面上除了纯色背景之外全部有动效. 也正因为如此,才做成了小程序内嵌的形式(太大了). 当多次快 ...

  4. Springboot,SSM框架比较,区别

    百度搜 Springboot,SSM框架区别,大多说的都是 1.springboot一个应用是一个可执行jar 2.将原有的xml配置,简化为java配置 他们说的确实没错,可是根本没有说到本质,百度 ...

  5. linux三剑客之grep

    linux基础三剑客之grep 1.grep命令 基本介绍 grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrep个fgrep. grep英文名:Global  sea ...

  6. 网页真机调试之Browsersync简介

    以前的调试方式 修改完项目文件(html.js.css等)后保存,在浏览器刷新页面查看修改后的效果 本地开启一个 tomcat 服务,修改文件后保存刷新页面,移动端或其他 pc 则需要输入 ip + ...

  7. java web(一):tomcat服务器的安装和简单介绍,与eclipse关联

    一:下载tomcat安装包和安装 这个百度一下就可以了. 安装完以后进入tomcat的安装路径查看 如图所示:有几个目录简单介绍下 bin目录:   存放运行tomcat服务器的相关命令. conf目 ...

  8. form表单图片上传

    1.前端页面 <div class="tkDiv" id="addLOGO" style="display:none;z-index:12;wi ...

  9. C#集合类型大揭秘 【转载】

    [地址]https://www.cnblogs.com/songwenjie/p/9185790.html 集合是.NET FCL(Framework Class Library)的重要组成部分,我们 ...

  10. mailto链接

    mailto链接是一种html链接,能够设置你电脑中邮件的默认发送信息,但是需要你电脑安装默认的E-mail软件,类似Microsoft Outlook等,那么点击mailto链接就可以获得默认设置的 ...