Scala选项-去掉if(opt.isDefined){}

Scala选项-去掉if(opt.isDefined){},scala,scala-option,Scala,Scala Option,我的代码中充斥着以下代码模式: val opt = somethingReturningAnOpt if (opt.isDefinedAt) { val actualThingIWant = opt.get } 有什么方法可以简化这一点吗?(它似乎不必要地复杂,而且带有代码味道)。理想的情况是: if (Some(actualThingIWant) = somethingReturningAnOpt) { doSomethingWith(actualThingIWant) }

我的代码中充斥着以下代码模式:

val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
    val actualThingIWant = opt.get
}
有什么方法可以简化这一点吗?(它似乎不必要地复杂,而且带有代码味道)。理想的情况是:

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

这样的事情可能吗?

可能是这样的:

somethingReturningAnOpt match {
  case Some(actualThingIWant) => doSomethingWith(actualThingIWant)
  case None =>
}
或者正如pst所建议的:

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

// or...

for (actualThingIWant <- somethingReturningAnOpt) {
  doSomethingWith(actualThingIWant)
}
somethingturninganopt.foreach{actualThingIWant=>
doSomethingWith(实际情况)
}
//或者。。。
对于(实际情况)我想要或:

例如:

val str = Some("foo")
str.map(_.toUpperCase)
…并在
doSomethingWith
的结果本身是一个选项时使用
flatMap

val index = Option(Map("foo" -> "bar"))
index.flatMap(_.get("whatever"))        // Returns None :-)
index.map(_.get("whatever"))            // Returns Some(None) :-(

托尼·莫里斯(Tony Morris)提出了争论的选项。

以下代码不能做一些有用的事情,因为在
if
之后,
actualThingIWant
并不总是被定义,因此只要您稍后尝试使用
actualThingIWant
,此代码就不会编译

val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
    val actualThingIWant = opt.get
}
因此,您必须提供一个默认值。这可以通过
getOrElse
实现:

val thingIWant = opt.getOrElse(myDefaultValue)
或者,如果您不希望在
if
的主体之后有
实际的iWant
,这意味着您只想在定义了该选项的情况下触发一些副作用,您可以编写:

opt.foreach{ thingIWant => 
  println(thingIWant)
}
或者再短一点

opt.foreach(println)

这看起来非常接近
match
尝试使用
if
语法…对前者有什么不满吗?另外,不要忘了在
for
中也可以使用该选项…可能会有一些帮助。for语法看起来几乎完美-但我唯一担心的是它不直观,可能会给其他人留下关于codeba的印象值得注意的是,for语法允许轻松地链接和组合选项调用:val optRes=for{res1就我个人而言,我发现案例陈述在大多数情况下更为清晰;我不知道托尼为什么不鼓励他们。我碰巧同意这两个评论!似乎改变了他的url结构这看起来像是一个链接唯一的答案。你能引用文章中的内容,使其更有用(并将其提升到今天的网站标准)吗?坦白地说,没有。但是如果你想通过转述别人的内容来为世界增值,这样别人就不必点击链接,请填写你的靴子。你甚至可以将其缩短为
somethingReturningAnOpt.map(doSomethingWith)
,否?我认为这是使用选项Monadat的正确方法。只有在为某些对象执行的操作实际返回值时,才能使用此选项。
opt.foreach(println)