2014-10-06 53 views
6

我解析了三个请求参数,所有这些参数都包含在Option类型中。如果这些选项中的任何一个是None,那么我想返回400错误。如何检查这些返回值是否为NoneScala中的多个选项值

+1

您使用的路由器是什么?有可能你可以简单地使这三个参数成为强制性的。 – 2014-10-06 11:49:43

回答

14

为什么不只是这样?

if (o1.isEmpty || o2.isEmpty || o3.isEmpty) BadRequest("Foo") 

Alternativeley取决于您的实施,您可能在某种集合中有您的选择。然后,你可以使用exists

if (parsedRequestParameters.exists(_.isEmpty)) BadRequest("Foo") 

你可能会喜欢第三种选择,如果你想要做的事与你选择的内容:

val response = for { 
    v1 <- o1 
    v2 <- o2 
    v3 <- o3 
} yield <some response depending on the values of o1..o3> 

response getOrElse BadRequest("something wasn't specified") 
2

我喜欢与他们一起工作作为一个集合选项的[T]

scala> Seq(Option(1), Option(5), None) 
res0: Seq[Option[Int]] = List(Some(1), Some(5), None) 

scala> val result = res0.exists(_.isEmpty) 
result: Boolean = true 
0

也可以使用压缩,但它会包裹元件基本成嵌套成对的SEQ是不容易变平以便重新使用

Some(1) zip Some(2) == List((1,2)) 
Some(2) zip Some(2) zip Some(3) == List(((1,2),3)) 
Some(1) zip Some(2) zip None == List() 

,或者你可以做exists这样的事情

val options = Seq(Some(p1), Some(p2), Some(p3),None) 
val parameters = options.flatten 
if(parameters.length == options.length) do something with parameters 
1

出于完整性超过Option的集合,也考虑forall,如下,

val a = Array(Some(3), None, Some(7)) 

a.forall(_.nonEmpty) 
res: false 

a.forall(!_.isEmpty) 
res: false 

a.forall(_.isDefined) 
res: false 

val b = Array(Some(3), Some(5), Some(7))  

b.forall(_.nonEmpty) 
res: true 

b.forall(_.isDefined) 
res: true 
6

另一种可能性,为完整性而添加:

(o1, o2, o3) match { 
    case(Some(p1), Some(p2), Some(p3)) => Ok // Do stuff with p1, p2, p3 
    case _ => BadRequest 
}