2014-10-06 12 views
6

Analizuję trzy parametry żądania, z których wszystkie są zawijane w typie Option. Jeśli któraś z tych opcji to None, wówczas chcę zwrócić błąd 400. Jak sprawdzić, czy którekolwiek z tych zwracanych wartości są typu None?Wiele wartości opcji w Scala

+1

jakiego router używasz? Możliwe, że po prostu trzy parametry będą obowiązkowe. –

Odpowiedz

14

Dlaczego po prostu tak nie jest?

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

Alternatywna zależnie od wdrożenia, możesz mieć opcje w jakiejś kolekcji. Następnie można użyć exists

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

trzecim alternatywnym może chcesz, w przypadku, gdy chcesz coś zrobić z treścią opcji:

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

Wolę pracować z nimi jak z kolekcji opcji [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

można również użyć zip, ale będzie to owinąć bazowych elementów w nast zagnieżdżonych par, które nie są łatwe do spłaszczyć do ponownego użycia

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() 

czy można zrobić coś takiego

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

dla kompletności na exists nad kolekcją Option, należy rozważyć również forall, jak następuje,

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

a.forall(_.nonEmpty) 
res: false 

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

a.forall(_.isDefined) 
res: false 

i

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

b.forall(_.nonEmpty) 
res: true 

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

Inna możliwość, dodana do kompletności:

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