Когда использовать опцию#orNull


Насколько я понимаю, мы должны избегать использования null в Scala. И если какое-то поле не является логически допустимым, чтобы иметь "нулевое значение", то мы не должны использовать Option, чтобы избежать чрезмерного использования Options.

Итак, давайте посмотрим на код. У меня есть класс

case class User (name: String)

И я на 100% уверен, что name поле не может быть null, и из-за этого я использовал Просто String вместо Option[String].

Проблема в том, что некоторые стандартные методы Scala возвращают мне Options. (в моем случае метод IterableLike#find возвращает Вариант)

Итак, вопрос в том, как я могу создать экземпляр User, когда у меня есть name, обернутый в Option? Чтобы быть немного ясным, это код:

val userName: Option[String] = myList.find(...)
val user = User(userName.get) // or may be I should use userName.orNull ? or throw exception?

Я слышал, что Option.get не является элегантным решением. orNullметод почти такой же, как get.

2 3

2 ответа:

orNull предоставляется в основном для обеспечения совместимости Java. Использование null в качестве значения sentinel во многих библиотеках Java широко распространено и orNull служит небольшим кусочком синтаксического сахара. По сути, это просто myOption.getOrElse(null), но с именем функции, которое позволяет немного более чистый код.

Использование orNull в чистом проекте Scala было бы по меньшей мере странно.

Вы хотите сопоставить ваш Option[String] с Option[User]:

val userName: Option[String] = myList.find(...)
val user: Option[User] = userName.map(n => User(n))