Testando um valor de Opção sem a ginástica

Em Boolean Operators for Option , mostrei como simplesmente construir um teste para a existência de um Option. Vá dar uma olhada, a ideia é simples e permite escrever:

val opt1 = Some("string")
val opt2
= None

if(opt1 && opt2) ...

em vez do mais longo if(opt1.isDefined && opt2.isDefined) .... É apenas uma maneira de escrever as coisas de uma maneira mais direta.

Mas e se você também quiser testar o que está no Option? Você pode usar uma matchconstrução se tiver apenas uma opção, mas quando estiver misturando coisas diferentes (como parâmetros opcionais), escrever uma correspondência é um pouco complicado e ifgeralmente mais direto.

Digamos que você tenha um parâmetro opcional para uma solicitação, que é uma string que representa uma visão especial. Além desse parâmetro opcional, você também deve testar se possui um ID de usuário válido na solicitação. Você pode fazer algo como:

def request(userID: Long, view: Option[String]) {
validateUser
(userID) match {
case None => ...
case Some(user) if view && view.get.equals("details") => ...
case Some(user) => ...
}
}

isso view && view.get.equals("details")é um pouco complicado, mas Optionseguindo a API de coleção, você pode usar um atalho muito bom para escrever tudo isso:

case Some(user) if view.exist(_.equals("details")) => ...

A existfunção só retorna verdadeiro se a Opção for Some e o predicado que você está fornecendo retornar verdadeiro. Aqui está o que o documento diz:

Retorna verdadeiro se esta opção não for vazia e o predicado p retornar verdadeiro quando aplicado ao valor deste scala.Option. Caso contrário, retorna falso.

É isso aí. O existsnome pode ser um pouco confuso, então você pode escrever um alias:

implicit class RichOpt[T](opt: Option[T]) {
def assert(p: T => Boolean): Boolean = opt.exists(p)
}

ou mesmo, se você só lidar com Stringno Option:

implicit class StrOpt(opt: Option[String]) {
def strEquals(s: String): Boolean = opt.exists(_.equals(s))
}

que você pode usar:
scala val opt1 = Some("string") //> opt1 : Some[String] = Some(string) opt1.assert(_.equals("test"))//> res0: Boolean = false opt1.strEquals("string") //> res1: Boolean = true