【问题标题】:Extracting field from Some in Scala从Scala中的Some中提取字段
【发布时间】:2013-12-20 09:21:04
【问题描述】:

我知道 Some 对象可以是 None 或我传递的对象之一。鉴于 Some 对象不是 None 的事实,从 Some 对象中提取字段的理想方法是什么? 我创建了一个“日期”作为其字段之一的“At”类。由于 Some 类有一个具有 Product trait 的 mixin,因此以下工作正常:

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

但是有没有理想的方法来做到这一点?

【问题讨论】:

  • 使用Optionfold方法Option类来提取值。或模式匹配。
  • 看看scala.Option Cheat Sheet。不幸的是它被删除了,所以我想我们应该备份它。

标签: scala scala-option


【解决方案1】:

有几种安全的方法可以使用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)

【讨论】:

  • 我想我们应该将所有方法组合在一个答案中。您会在答案中添加matchmap + getOrElsefor-comprehension(有和没有yield)、foreach 等等吗?
  • 此链接可能会有所帮助:scala.Option Cheat Sheet。原始帖子已被删除,所以我想您应该尽可能安全。我会在@Core_Dumped 接受后立即删除我的答案。
【解决方案2】:

有两种方式:

1) 你可以使用'get'方法。但是只有当你 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) } 

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2015-05-13
    • 2019-12-24
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多