Подтвердить что ты не робот

Scala Опция - избавиться от if (opt.isDefined) {}

Мой код становится заваленным следующим шаблоном кода:

val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
    val actualThingIWant = opt.get
}

Есть ли способ упростить это? (это кажется излишне сложным и запах кода). В идеале это было бы что-то вроде:

if (Some(actualThingIWant) = somethingReturningAnOpt) {
   doSomethingWith(actualThingIWant)
}

Возможно ли подобное?

4b9b3361

Ответ 1

Возможно, что-то вроде этого:

somethingReturningAnOpt match {
  case Some(actualThingIWant) => doSomethingWith(actualThingIWant)
  case None =>
}

или как pst предлагает:

somethingReturningAnOpt.foreach { actualThingIWant =>
  doSomethingWith(actualThingIWant)
}

// or...

for (actualThingIWant <- somethingReturningAnOpt) {
  doSomethingWith(actualThingIWant)
}

Ответ 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)