none - Opción Scala-Deshacerse de if(opt.isDefined){}
scala option get (4)
El siguiente código no puede hacer algo útil, ya que después de if
, actualThingIWant
no siempre se define y, como tal, este código no se compilará, siempre y cuando intente utilizar actualThingIWant
más adelante.
val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
val actualThingIWant = opt.get
}
Por lo tanto, tienes que proporcionar un valor predeterminado. Esto se puede lograr con getOrElse
:
val thingIWant = opt.getOrElse(myDefaultValue)
O si no desea tener actualThingIWant
después del cuerpo de if
, lo que significa que desea desencadenar algunos efectos secundarios solo si la opción está definida, puede escribir:
opt.foreach{ thingIWant =>
println(thingIWant)
}
o un poco más corto
opt.foreach(println)
Mi código se está llenando con el siguiente patrón de código:
val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
val actualThingIWant = opt.get
}
¿Hay alguna manera de simplificar esto? (Parece innecesariamente complejo y huele a código). Idealmente sería algo como:
if (Some(actualThingIWant) = somethingReturningAnOpt) {
doSomethingWith(actualThingIWant)
}
¿Es algo así posible?
La guía canónica para la lucha de opciones es de Tony Morris.
O:
somethingReturningAnOpt.map(doSomethingWith(_))
Como en
val str = Some("foo")
str.map(_.toUpperCase)
... y use flatMap
cuando el resultado de doSomethingWith
es una Opción en sí misma.
val index = Option(Map("foo" -> "bar"))
index.flatMap(_.get("whatever")) // Returns None :-)
index.map(_.get("whatever")) // Returns Some(None) :-(
Tal vez algo como esto:
somethingReturningAnOpt match {
case Some(actualThingIWant) => doSomethingWith(actualThingIWant)
case None =>
}
o como pst sugiere:
somethingReturningAnOpt.foreach { actualThingIWant =>
doSomethingWith(actualThingIWant)
}
// or...
for (actualThingIWant <- somethingReturningAnOpt) {
doSomethingWith(actualThingIWant)
}