Способный метод обертывания в Java с опцией в Scala?

StackOverflow https://stackoverflow.com/questions/4692506

  •  11-10-2019
  •  | 
  •  

Вопрос

Предположим, у меня есть метод session.get(str: String): String Но вы не знаете, вернет ли он вам строку или нулевую, потому что она исходит от Java.

Есть ли более простой способ лечить это в скала вместо session.get("foo") == null ? Может быть, какая -то магия применима как ToOption(session.get("foo")) И тогда я могу относиться к нему в виде скалы, как

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}
Это было полезно?

Решение

А Option Компаньон объект apply Метод служит функцией преобразования из нулевых ссылок:

scala> Option(null)
res4: Option[Null] = None

scala> Option(3)   
res5: Option[Int] = Some(3)

Другие советы

А Option Объект имеет applyметод, который делает именно это:

var myOptionalString = Option(session.get("foo"));

Обратите внимание, что при работе с объектами Java это не сработает, как и ожидалось:

val nullValueInteger : java.lang.Integer = null
val option: Option[Int] = Option(nullValueInteger)
println(option)  // Doesn't work - zero value on conversion

val nullStringValue : String = null
val optionString: Option[String] = Option(nullStringValue)
println(optionString) // Works - None value

Это очень старая тема, но хорошая!

Это правда, что преобразование любого неэффективного результата опции Try to приведет к некоторым ...

scala> Try(null).toOption
res10: Option[Null] = Some(null)

... Потому что попробуйте не о проверке нуля, а просто способ функционально обрабатывать исключения.

Использование попытки поймать исключение и преобразование его в опцию для удобства покажет только ни одного в случае, если произойдет исключение.

scala> Try(1/0).toOption
res11: Option[Int] = None

Вы хотите сохранить ценности, которые выходят из попытки. Это может быть нулевым.

Но это также верно, что стандартная либерация иногда довольно сбивает с толку ...

scala> Try(null).toOption
res12: Option[Null] = Some(null)

scala> Option(null)
res13: Option[Null] = None

Такое поведение немного непоследовательно, но оно как бы отражает натуральное использование как Try, так и Option.

Вы используете, пытаясь получить все, что выходит из выражения, которое может вызвать исключения, и вам не волнует само исключение.

Ценность, которая может выйти, вполне может быть нулевым. Если топция не дала ничего, Вы не можете различить исключение и нулевое, и это не красиво!

Автономный, вы используете опцию, чтобы инкапсулировать существование или нет чего -то. Таким образом, в этом случае некоторые (нулевые) нет, и это имеет смысл, потому что в этом случае NULL представляет собой отсутствие чего -либо. Здесь нет двусмысленности.

Важно отметить, что в любом случае прозрачность ссылки не сломана, поскольку. нет так же, как Option ()

Если вам действительно нужно применять соблюдение ОБА Безопасность исключений А ТАКЖЕ нулевая безопасность и ваш код Действительно действительно не нужно различать NULL и исключение, Вам просто нужно объединить обе парадигмы! Потому что ну, это то, что ты хочешь, верно?

Вы можете сделать это одним способом ...

scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None

scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None

scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)

... или другой ...

scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None

scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None

scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)

... или самые смехотворно самые уродливые из них анома ...

scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None

scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None

scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top