Scala 如果是空白问题
我对代码装饰有意见 例如,我应该处理DAO中的对象Scala 如果是空白问题,scala,scala-collections,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 { ... } 上面提到的代码看起来像命令式风格,它能更具功能吗?如何
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 {
...
}
上面提到的代码看起来像命令式风格,它能更具功能吗?如何将if更改为更实用的方式
比尔 @ka4eli的解决方案还可以,但我认为它有点复杂,因为如果存在一个空的
用户,结果将是一些(无)
,这让我感到困惑
如果我可以建议一个更清洁的解决方案,诚然是受到@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
函数在集合的所有元素上测试一个谓词——在本例中,该元素不是空的
如果您想知道用户
中的哪一个是空的,您需要使用更复杂的逻辑。存在
应该可以帮助您:
if (List(user1, user2, user3).exists(_.isEmpty))
// error
...
else // ok
...
假设DAO.get
返回一个选项[User]
,您可以使用for comprehensibility指定如果所有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"
val成功:选项[String]=for{
我不会说find
是这里选择的函数,因为它将返回第一个非空用户,而OP可能希望对所有用户进行逻辑处理,并且肯定希望确保所有用户都不为空。您仍在使用find
,它将只返回第一个空用户。如果它为空esn找不到空用户,则不会执行任何案例。如果任何用户为空,则某些案例是-与OP If else的逻辑完全相同。你是对的,我误解了解决方案。不过,我觉得这个解决方案不太可读,因为如果我这次理解正确,错误案例会返回Some(无)
,成功案例将返回一个None
。错误案例将返回一些(user)whre user。isEmpty==true。并且None将表示所有用户都不是空的-它不必再返回一些。请看我的评论,结果不会是一些(None)不会工作。因为即使定义了第一个用户而其他用户没有定义,它也会失败。代码中描述的代码会短路。@AndreasNeumann是的,目的是只要用户
中至少有一个是空的,就失败,就像OP的问题一样:如果(user1.isEmpty | user2.isEmpty | user3.isEmpty){return error…”}
DAO.get()的返回类型是什么?
val success: Option[String] = for {
x <- DAO.get(token)
y <- DAO.get(token)
z <- DAO.get(token)
} yield "retrieved 3 users"
success getOrElse "error"