Scala Опция - избавиться от if (opt.isDefined) {}
Мой код становится заваленным следующим шаблоном кода:
val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
val actualThingIWant = opt.get
}
Есть ли способ упростить это? (это кажется излишне сложным и запах кода). В идеале это было бы что-то вроде:
if (Some(actualThingIWant) = somethingReturningAnOpt) {
doSomethingWith(actualThingIWant)
}
Возможно ли подобное?
Ответы
Ответ 1
Возможно, что-то вроде этого:
somethingReturningAnOpt match {
case Some(actualThingIWant) => doSomethingWith(actualThingIWant)
case None =>
}
или как pst предлагает:
somethingReturningAnOpt.foreach { actualThingIWant =>
doSomethingWith(actualThingIWant)
}
// or...
for (actualThingIWant <- somethingReturningAnOpt) {
doSomethingWith(actualThingIWant)
}
Ответ 2
канонический путеводитель в споре Варианта - Тони Моррис.
Ответ 3
Или:
somethingReturningAnOpt.map(doSomethingWith(_))
Как и в:
val str = Some("foo")
str.map(_.toUpperCase)
... и используйте flatMap
, когда результатом doSomethingWith
является сам параметр.
val index = Option(Map("foo" -> "bar"))
index.flatMap(_.get("whatever")) // Returns None :-)
index.map(_.get("whatever")) // Returns Some(None) :-(
Ответ 4
Следующий код не может сделать что-то полезное, поскольку после if
, actualThingIWant
не всегда определяется и, как таковой, этот код не будет компилироваться, если вы попытаетесь использовать actualThingIWant
позже.
val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
val actualThingIWant = opt.get
}
Итак, вы должны указать значение по умолчанию. Этого можно достичь с помощью getOrElse
:
val thingIWant = opt.getOrElse(myDefaultValue)
Или, если вы не хотите иметь actualThingIWant
после тела if
, что означает, что вы хотите вызвать некоторые побочные эффекты, только если этот параметр определен, вы можете написать:
opt.foreach{ thingIWant =>
println(thingIWant)
}
или немного короче
opt.foreach(println)