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)