Scala选项 - 摆脱if(opt.isDefined){}

时间:2011-12-08 06:56:46

标签: scala scala-option

我的代码变得乱七八糟,使用以下代码模式:

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

有没有办法简化这个? (似乎不必要的复杂和代码味道)。理想情况下它会是这样的:

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

有可能吗?

4 个答案:

答案 0 :(得分:33)

也许是这样的:

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

或pst暗示:

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

// or...

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

答案 1 :(得分:30)

选项争吵的canonical guide由Tony Morris提供。

答案 2 :(得分:10)

或者:

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) :-(

答案 3 :(得分:5)

以下代码无法执行有用的操作,因为在if之后,actualThingIWant并不总是被定义,因此只要您尝试使用actualThingIWant,此代码就无法编译后面。

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

因此,您必须提供默认值。这可以通过getOrElse

来实现
val thingIWant = opt.getOrElse(myDefaultValue)

或者,如果您不想在actualThingIWant的正文后面有if,这意味着只有在定义了该选项后才想触发一些副作用,您可以写:< / p>

opt.foreach{ thingIWant => 
  println(thingIWant)
}

或稍短一点

opt.foreach(println)