Pergunta

Eu costumo me encontrar com um Option[T] Para algum tipo T e deseja testar o valor da opção em relação a algum valor. Por exemplo:

val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes") 
   //do something

O código a seguir é equivalente e remove o requisito de testar o existência do valor da opção

if (opt.map(_ == "lakes").getOrElse(false))
 //do something

No entanto, isso parece menos legível para mim. Outras possibilidades são:

if (opt.filter(_ == "lakes").isDefined)

if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable

Mas acho que isso não expressa claramente a intenção, o que seria melhor como:

if (opt.isDefinedAnd(_ == "lakes"))

Alguém tem uma maneira melhor de fazer esse teste?

Foi útil?

Solução

Que tal

if (opt == Some("lakes"))

Isso expressa a intenção claramente e é direto.

Outras dicas

Para Scala 2.11, você pode usar Some(foo).contains(bar)

Walter Chang ftw, mas aqui está outra alternativa estranha:

Some(2) exists (_ == 2)
val opt = Some("oxbow")
opt match {
  case Some("lakes") => //Doing something
  case _ => //If it doesn't match
}

Você também pode usar a compreensão:

for {val v <- opt if v == "lakes"}
  // do smth with v

Eu acho que a correspondência de padrões também pode ser usada. Dessa forma, você extrai o valor interessante diretamente:

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top