Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如果是空白问题_Scala_Scala Collections - Fatal编程技术网

Scala 如果是空白问题

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 { ... } 上面提到的代码看起来像命令式风格,它能更具功能吗?如何

我对代码装饰有意见

例如,我应该处理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 {
 ... 
}
上面提到的代码看起来像命令式风格,它能更具功能吗?如何将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"