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 match
construçã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 if
geralmente 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 Option
seguindo 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 exist
funçã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 exists
nome 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 String
no 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