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"