如果isEmpty问题

时间:2015-08-11 09:51:35

标签: scala scala-collections

我有关于代码装饰的问题。

例如我应该处理来自DAO的对象

val user1 = DAO.get(token)
val user2 = DAO.get(token)
val user3 = DAO.get(token)

接下来我应该检查user.isDefined

if (user1.isEmpty || user2.isEmpty || user3.isEmpty ) {
return "error..."
}
else {
 ... 
}

提到的代码看起来像命令式样式,它可以更具功能性吗?如何更改功能?

BR!

4 个答案:

答案 0 :(得分:7)

假设DAO.get返回Option[User],您可以使用for comprehension来指定如果所有3个选项都是Some会发生什么。然后,使用getOrElse指定应该发生的事情。

val success: Option[String] = for {
    x <- DAO.get(token)
    y <- DAO.get(token)
    z <- DAO.get(token)
} yield "retrieved 3 users"

success getOrElse "error"

答案 1 :(得分:1)

SELECT ( SELECT MIN(DATE) FROM user_day_status WHERE VERIFICATION_TOKEN = uds.VERIFICATION_TOKEN ) AS DATE_FROM, ( SELECT MAX(DATE) FROM user_day_status WHERE VERIFICATION_TOKEN = uds.VERIFICATION_TOKEN ) AS DATE_TO, uds.USER_ID,uds.VERIFICATION_TOKEN,uds.DESCRIPTION FROM user_day_status uds GROUP BY uds.VERIFICATION_TOKEN 可以帮助您:

exists

答案 2 :(得分:0)

List(user1,user2,user3).find(_.isEmpty) match {
    case Some(x) => "error"
    case None => ...
}

答案 3 :(得分:0)

@ ka4eli的解决方案没问题,但我认为这有点令人费解,因为如果存在空的user,结果将是Some(None),我觉得这令人困惑

如果我可以建议一个更清洁的解决方案,不可否认的是@ ka4eli的回答:

val userOpts = (1 to 3).map(_ => DAO.get(token))

if (userOpts.forall(_.nonEmpty)) {
  // everything OK
  val users = userOpts.map(_.get)
  // do your thing with users
} else {
  // error
}

forall函数测试集合中所有元素的谓词 - 在这种情况下元素不为空。

如果你想知道 user的哪个是空的,你将需要使用更复杂的逻辑。