用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. ckeditor_配置 修改工具栏段落的标签和在文中的格式

    在默认的工具栏中自带一个格式的选项,可以编辑文字的段落属性,将文字转换为标题.ckeditor中提供了方法可以对这个标签进行修改. 正在做的项目中不叫标题1标题2,叫章.节.条... . 需要进行配置 ...

  2. python学习6---排序问题

    1.对列表排序 一维列表: sorted():可用于任何可迭代对象,如数组.列表.字典等. sort():list.sort()返回None,这是因为sort在函数内部修改了list的值,当再次访问l ...

  3. CSS-图片占位的技巧

      图片占位技巧,防止动态获取图片 网络慢,页面一跳一跳的情况发生 .food .image-header {                position: relative;  width: 1 ...

  4. 对C语言指针的理解

    一个小程序引发对于C语言指针的思考: #include <bits/stdc++.h> using namespace std; void my_swap (int* a,int* b) ...

  5. Python:从入门到实践--第十一章--测试代码--练习

    #1.城市和国家:编写一个函数,它接受两个形参:一个城市名和一个国家名. #这个函数返回一个格式为City,Country的字符串,如Santiago,Chile.将这个函数 #存储在一个名为city ...

  6. jquery Ajax 实现图片上传的功能。

    $('#image').on('change', function () {         var url = "";         var form = new FormDa ...

  7. 爬虫基础之urllib库

    urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...

  8. oracle 11g log archive mode flashback

    修改需要在mount状态下 shutdown immediate; startup mount; alter database archivelog; alter database flashback ...

  9. 你想知道吗?come

    从大二接触Java开始,到现在也差不多三个年头了.从最基础的HTML.CSS到最后的SSH自己都是一步一个脚印走出来的,其中开心过.失落过.寂寞过.虽然是半道出家但是经过自己的努力也算是完成了“学业” ...

  10. Azure monitor Portal 、Azure monitor API监控指标、性能监视器常用指标