我知道 Some 对象可以是 None 或我传递的对象之一。鉴于 Some 对象不是 None 的事实,从 Some 对象中提取字段的理想方法是什么?我创建了一个“日期”作为其字段之一的“At”类。由于 Some 类具有具有 Product 特征的 mixin,因此以下工作正常:
(An object with return type Some(At)).productElement(0).asInstanceOf[At].date
但是有没有理想的方法来做到这一点?
我知道 Some 对象可以是 None 或我传递的对象之一。鉴于 Some 对象不是 None 的事实,从 Some 对象中提取字段的理想方法是什么?我创建了一个“日期”作为其字段之一的“At”类。由于 Some 类具有具有 Product 特征的 mixin,因此以下工作正常:
(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)
有两种方法:
1)您可以使用“获取”方法。但是只有当你 300% 确定不会有 None 时,你才应该使用它。正如你将得到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) }