我知道Some对象可以是None或我传递的对象之一。鉴于它不是None,从Some对象中提取字段的理想方法是什么? 我已经制作了一个'at'课程,其中'date'是其中一个领域。由于Some类有一个带有Product trait的mixin,以下工作正常:
(An object with return type Some(At)).productElement(0).asInstanceOf[At].date
但是有理想的方法吗?
答案 0 :(得分: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
中提取,则可以使用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)
答案 1 :(得分:0)
有两种方法:
1)您可以使用'get'方法。但是,只有在300%确定没有“无”时才应使用。你会得到java.util.NoSuchElementException: None.get
。
val option: Option[At] = getAtMethod val dateField = option.get.date
2)由于Option是monad,你可以使用'map'方法:
val option: Option[At] = ... val optionalDate: Option[Date] = option map { _.date }
或者您可以使用它:
option map { at => myMethod(at.date) }