Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Scala中的某些字段中提取字段_Scala_Scala Option - Fatal编程技术网

从Scala中的某些字段中提取字段

从Scala中的某些字段中提取字段,scala,scala-option,Scala,Scala Option,我知道某个对象可以是无对象,也可以是我传递的对象之一。如果某个对象没有字段,那么从该对象中提取字段的理想方法是什么? 我创建了一个“At”类,其中的一个字段是“date”。由于Some类与Product trait有一个混合,下面的方法很好: (An object with return type Some(At)).productElement(0).asInstanceOf[At].date 但是有没有一个理想的方法可以做到这一点呢 使用选项有几种安全的方法。如果要检索包含的值,我建议您使

我知道某个对象可以是无对象,也可以是我传递的对象之一。如果某个对象没有字段,那么从该对象中提取字段的理想方法是什么? 我创建了一个“At”类,其中的一个字段是“date”。由于Some类与Product trait有一个混合,下面的方法很好:

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

但是有没有一个理想的方法可以做到这一点呢

使用
选项有几种安全的方法。如果要检索包含的值,我建议您使用
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 =>
}
如果要修改该值并将其传递到其他地方,而不从
选项中提取它,则可以使用
映射
平面映射
过滤器/带过滤器
等,因此也可以用于理解:

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)
有两种方法:

1) 您可以使用“get”方法。但只有当你有300%的把握不存在时,你才应该使用它。您将得到
java.util.NoSuchElementException:None.get

2) 由于选项是单子,您可以使用“映射”方法:

或者您可以使用它:

option map { at => myMethod(at.date) } 

使用
选项
类的
折叠
方法提取值。或者模式匹配。看看。不幸的是,它被删除了,所以我想我们应该把它勾起来。我想我们应该把所有的方法组合在一个单一的答案中。您是否愿意在您的答案中添加
匹配
映射
+
getOrElse
理解
(带和不带
收益
),
foreach
等等?此链接可能会有所帮助:。原来的帖子被删除了,所以我想你应该尽可能的安全。只要@Core\u接受我的答案,我就会删除它。
val option: Option[At] = getAtMethod
val dateField = option.get.date
val option: Option[At] = ...
val optionalDate: Option[Date] = option map { _.date }
option map { at => myMethod(at.date) }