Try/Option с нулевым значением

Я ищу возможность в scala вызвать функцию и получить Option как результат, который является "Нет", если при вызове метода или метода возвращается значение null. В противном случае параметр должен иметь значение результата.

Я знаю, что Try может использоваться для первой части, но я не знаю, как обрабатывать вторую часть:

val result = Try(myFunction).toOption()

Если теперь метод возвращает null (поскольку он не является функцией scala, а функцией Java), result является Some(null) вместо None.

Ответ 1

Как я знаю, в scala стандартной библиотеке есть только 1 метод для преобразования null в None - Option.apply(x), поэтому вы должны использовать его вручную:

val result = Try(myFunction).toOption.flatMap{Option(_)}
// or
val result = Try(Option(myFunction)).toOption.flatten

Вы можете создать свой собственный вспомогательный метод следующим образом:

implicit class NotNullOption[T](val t: Try[T]) extends AnyVal {
  def toNotNullOption = t.toOption.flatMap{Option(_)}
}

scala> Try(null: String).toNotNullOption
res0: Option[String] = None

scala> Try("a").toNotNullOption
res1: Option[String] = Some(a)

Ответ 2

Вы также можете сделать это:

val result = Try(myFunction).toOption.filter(_ != null)

который выглядит и чувствует себя лучше, чем .flatten или .flatMap(Option(_))

Ответ 3

Вы также можете выполнить сопоставление с образцом как:

val result = myFunction() match {
   case null => None
   case _    => Some(_)
}

но ответ @senia выглядит более "scala style"