我知道Some對象可以是None或我傳遞的對象之一。鑑於它不是無的事實,從Some對象中提取字段的理想方式是什麼? 我已經做了一個'在'具有'日期'作爲其領域之一。由於某些類具有產品特性的混入,以下工作正常:從Scala中抽取字段
(An object with return type Some(At)).productElement(0).asInstanceOf[At].date
但是,有沒有一種理想的方法來做到這一點?
我知道Some對象可以是None或我傳遞的對象之一。鑑於它不是無的事實,從Some對象中提取字段的理想方式是什麼? 我已經做了一個'在'具有'日期'作爲其領域之一。由於某些類具有產品特性的混入,以下工作正常:從Scala中抽取字段
(An object with return type Some(At)).productElement(0).asInstanceOf[At].date
但是,有沒有一種理想的方法來做到這一點?
有幾種安全的方式與Option
一起使用。如果您想檢索包含的值,我建議您使用fold
,getOrElse
或模式匹配。
opt.fold { /* if opt is None */ } { x => /* if opt is Some */ }
opt.getOrElse(default)
// matching on options should only be used in special cases, most of the time `fold` is sufficient
opt match {
case Some(x) =>
case None =>
}
如果你要修改的值,並把它傳遞到別的地方不從Option
提取它,你可以使用map
,flatMap
,filter/withFilter
等,並因此也對-內涵:
opt.map(x => modify(x))
opt.flatMap(x => modifyOpt(x)) // if your modification returns another `Option`
opt.filter(x => predicate(x))
for {
x <- optA
y <- optB
if a > b
} yield (a,b)
或者,如果你想執行一個副作用,您可以使用foreach
opt foreach println
for (x <- opt) println(x)
我想我們應該在一個答案中結合所有方法。你會添加到你的答案'匹配','地圖'+'getOrElse','for-comprehension'(帶和不帶'yield'),'foreach'等等? – senia
完成,謝謝你的建議。 – drexin
此鏈接可能會有幫助:[scala.Option Cheat Sheet](http://web.archive.org/web/20131206133026/http://blog.tmorris.net/posts/scalaoption-cheat-sheet/#fn1) 。原帖被刪除,所以我想你應該儘可能安全。只要@Core_Dumped接受它,我會盡快刪除我的答案。 – senia
有兩種方法:
1)您可以使用'get'方法。但是,只有在300%確定沒有無時才應該使用。正如你將得到java.util.NoSuchElementException: None.get
。
val option: Option[At] = getAtMethod val dateField = option.get.date
2)作爲選項是一個單子可以使用 '地圖' 方法:
val option: Option[At] = ... val optionalDate: Option[Date] = option map { _.date }
或可以使用它:
option map { at => myMethod(at.date) }
使用'Option'是'Option'類的'fold'方法來提取值。或模式匹配。 – Mik378
看看[scala.Option Cheat Sheet](http://web.archive.org/web/20131206133026/http://blog.tmorris.net/posts/scalaoption-cheat-sheet/#fn1)。不幸的是它被刪除了,所以我想我們應該記住它。 – senia