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