我有关于代码装饰的问题。
例如我应该处理来自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!
答案 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
的哪个是空的,你将需要使用更复杂的逻辑。