2014-10-06 3 views
6

Я анализирую три параметра запроса, все из которых завернуты в тип Option. Если какой-либо из этих опций - None, то я хочу вернуть ошибку 400. Как проверить, имеет ли какое-либо из этих возвращаемых значений тип None?Множественные значения опций в Scala

+1

Какой маршрутизатор вы используете? Скорее всего, вы можете просто сделать три параметра обязательными. –

ответ

14

Почему бы не просто так?

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

Альтернатива в зависимости от вашей реализации может иметь свои варианты в какой-то коллекции. Тогда вы могли бы использовать 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

Вы также можете использовать почтовый индекс, но он будет обернуть основной элементы в послед вложенных пар, которые не легко выравниваться для повторного использования

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

или вы могли бы сделать что-то вроде этого

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

Для полноты на exists над коллекцией 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 
} 
Смежные вопросы