scala中Either的一种使用场景 scala中Either的一种使用场景

用scala有一年多了,对于scala中的Option和Try使用的较为频繁,对其应用场景相对熟悉一些。而对于Either,仔细回想一下却发现几乎(彻底)没有使用过,其实并非没有遇到过Either的使用场景,只是遇到的时候不知道可以使用Either来解决此问题。
昨天在网上偶然看到一篇介绍Either的文章,发现有一种场景可使用Either来解决,具体是这样的:
html

  web系统中,Controller层调用service层方法,根据邮箱查询注册的用户User,若是未取到User,则须要知道是什么缘由致使的。

定义一个方法,根据登陆邮箱查询User对象,方法签名如: def getUserByEmail(email:String):Userweb

注意方法的返回值类型,这里返回的是User对象。在运行时会发生以下三种状况:post

  一、正常返回null url

  二、正常返回User spa

  三、发生异常抛出Exception。scala

对于状况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]code

  若是查询到User,那么返回一个Right(user)便可,若是邮箱格式错误,则返回一个Left("邮箱格式错误"),若是该邮箱未进行注册,则返回Left("该邮箱未进行注册");若是运行中发生Exception,能够直接抛出,也能够封装为Left("发生XXX异常")返回给调用处。
除了经过Either来返回失败信息,咱们也可使用Tuple2[String,User]类型来实现想要的结果,在失败的时候返回Tuple2("失败缘由描述",null),只是相对于Either来讲,不是那么便捷。htm

 使用方式可见以下伪代码:对象

 1  @Test
 2   def testEither(): Unit = {
 3     getUserByEmail("xxx@sina.com") match {
 4       case Right(user) => ???
 5       case Left(msg) => println("查询用户失败,缘由:" + msg)
 6     }
 7   }
 8 
 9   def getUserByEmail(email: String): Either[String, User] = {
10     if (email无效) {
11       return Left("邮箱格式错误")
12     } else {
13       if (未查询到注册邮箱) {
14         return Left("该用户不存在")
15       } else {
16         return Right(user)
17       }
18     }
19   }

 

=========================================blog

原文连接:scala中Either的一种使用场景

=========================================

-------end

相关文章
相关标签/搜索