2013-12-20 30 views
1

我知道Some對象可以是None或我傳遞的對象之一。鑑於它不是無的事實,從Some對象中提取字段的理想方式是什麼? 我已經做了一個'在'具有'日期'作爲其領域之一。由於某些類具有產品特性的混入,以下工作正常:從Scala中抽取字段

(An object with return type Some(At)).productElement(0).asInstanceOf[At].date 

但是,有沒有一種理想的方法來做到這一點?

+1

使用'Option'是'Option'類的'fold'方法來提取值。或模式匹配。 – Mik378

+0

看看[scala.Option Cheat Sheet](http://web.archive.org/web/20131206133026/http://blog.tmorris.net/posts/scalaoption-cheat-sheet/#fn1)。不幸的是它被刪除了,所以我想我們應該記住它。 – senia

回答

4

有幾種安全的方式與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提取它,你可以使用mapflatMapfilter/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) 
+2

我想我們應該在一個答案中結合所有方法。你會添加到你的答案'匹配','地圖'+'getOrElse','for-comprehension'(帶和不帶'yield'),'foreach'等等? – senia

+0

完成,謝謝你的建議。 – drexin

+0

此鏈接可能會有幫助:[scala.Option Cheat Sheet](http://web.archive.org/web/20131206133026/http://blog.tmorris.net/posts/scalaoption-cheat-sheet/#fn1) 。原帖被刪除,所以我想你應該儘可能安全。只要@Core_Dumped接受它,我會盡快刪除我的答案。 – senia

0

有兩種方法:

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) }