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

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

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

case class User (name: String)

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

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

Итак, вопрос в том, как я могу создать экземпляр 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.


person MyTitle    schedule 16.04.2015    source источник
comment
Вы на 100% уверены, что name не может быть None, но уверены ли вы на 100%, что name находится в myList? Разве вы не хотели бы сделать его Option[User], в зависимости от того, найден ли User по имени?   -  person Michael Zajac    schedule 16.04.2015
comment
Они оба ужасны, но orNull хуже, чем get. get на None сразу выдает исключение, а orNull устанавливает мину.   -  person Travis Brown    schedule 16.04.2015


Ответы (2)


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

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

person Ryan    schedule 16.04.2015

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

val userName: Option[String] = myList.find(...)
val user: Option[User] = userName.map(n => User(n))
person Jean Logeart    schedule 16.04.2015
comment
Чрезвычайно элегантный. Это фактически использует Option, возвращающееся из find(), чтобы улучшить код, а не уродовать его :-) - person millhouse; 17.04.2015