2014-10-06 61 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 
}