为什么使用Option.get会产生编译错误

时间:2020-05-26 07:49:01

标签: scala

我想过滤掉序列中未定义的选项,并创建没有选项(具有实际值)的序列。我正在尝试在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]     

有人有类似的问题吗?

2 个答案:

答案 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来显式处理SomeNone情况。

以及其他可能遇到类似警告/错误的情况(取决于项目中的WartRemover配置)。

尽管在这种情况下,@ jwvh提出的修复优于foldgetOrElse