我想过滤掉序列中未定义的选项,并创建没有选项(具有实际值)的序列。我正在尝试在scala中编译以下代码:
val idLibId = idOptionalLibId.filter(idOptionalLibId => idOptionalLibId._2.isDefined)
.map(idLibId => idLibId._1 -> idLibId._2.get)
idOptionalLibId是元组的Seq。
但是它给了我以下错误:
[error] MandatoryApprovalOverride.scala:27:55: Use of Option.get
[error] .map(idLibId => (idLibId._1 -> idLibId._2.get))
[error]
有人有类似的问题吗?
答案 0 :(得分:5)
在.get
上调用Option
是危险的,因为如果值是None
则会抛出该异常。您知道已经过滤掉所有None
值,但是编译器没有。
这不是更好的方法吗?
val idLibId = idOptionalLibId.collect{case (k,Some(v)) => k -> v}
答案 1 :(得分:3)
这将是一个错误的唯一原因是由于您的特定项目的设置,例如WartRemover可以警告Option.get
,而-Xfatal-warnings
则可以将所有警告变为错误。您可以看到https://www.wartremover.org/doc/warts.html的动机:
scala.Option
有一个get
方法,如果该值为None
,则会抛出该方法。该程序应重构为使用scala.Option#fold
来显式处理Some
和None
情况。
以及其他可能遇到类似警告/错误的情况(取决于项目中的WartRemover配置)。
尽管在这种情况下,@ jwvh提出的修复优于fold
或getOrElse
。