Почему использование Option.get дает ошибку компиляции - PullRequest
0 голосов
/ 26 мая 2020

Я хочу отфильтровать параметры, которые не определены в последовательности, и создать последовательность без параметров (с фактическим значением). Я пытаюсь скомпилировать следующий код в scala:

val idLibId = idOptionalLibId.filter(idOptionalLibId => idOptionalLibId._2.isDefined)
.map(idLibId => idLibId._1 -> idLibId._2.get)

idOptionalLibId - это последовательность кортежей.

Но это дает мне следующую ошибку:

[error] MandatoryApprovalOverride.scala:27:55: Use of Option.get
[error]             .map(idLibId => (idLibId._1 -> idLibId._2.get))
[error]     

У кого-нибудь была подобная проблема?

Ответы [ 2 ]

5 голосов
/ 26 мая 2020

Вызов .get на Option опасен, потому что он выдаст, если значение равно None. Вы знаете, что вы отфильтровали все значения None, но компилятор этого не сделал.

Разве это не лучший способ сделать это?

val idLibId = idOptionalLibId.collect{case (k,Some(v)) => k -> v}
3 голосов
/ 26 мая 2020

Единственная причина, по которой это может быть ошибка, связана с настройками вашего конкретного проекта, например, комбинацией 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...