从Scala中的Some中提取字段

时间:2013-12-20 09:21:04

标签: scala scala-option

我知道Some对象可以是None或我传递的对象之一。鉴于它不是None,从Some对象中提取字段的理想方法是什么? 我已经制作了一个'at'课程,其中'date'是其中一个领域。由于Some类有一个带有Product trait的mixin,以下工作正常:

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

但是有理想的方法吗?

2 个答案:

答案 0 :(得分:4)

有几种安全的方法可以使用Option。如果您想检索包含的值,我建议您使用foldgetOrElse或模式匹配。

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)

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