我的代码变得乱七八糟,使用以下代码模式:
val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
val actualThingIWant = opt.get
}
有没有办法简化这个? (似乎不必要的复杂和代码味道)。理想情况下它会是这样的:
if (Some(actualThingIWant) = somethingReturningAnOpt) {
doSomethingWith(actualThingIWant)
}
有可能吗?
答案 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)