Groovy язык имеет? синтаксис для исключения из NullPointer, есть ли что-то похожее в scala? - PullRequest
2 голосов
/ 05 июля 2011

Предположим, у меня есть параметр String из параметров запроса строки запроса.Как вы знаете, параметр может отсутствовать или быть там, но значение является пустой строкой.В отличном языке я могу просто сделать что-то вроде

  List lst = words?.split(',') 

, если бы слова были нулевыми, lst был бы нулевым, вместо того, чтобы бросать NPE

, что похоже на ярлык в scala?

Опция [String] здесь не является опцией, так как слова имеют тип String, как это происходит из строки запроса.

Ответы [ 4 ]

14 голосов
/ 05 июля 2011

Если вы хотите сохранить нулевые значения,

val lst = Option(words).map(_ split ',').orNull

Но что вам нужно сделать, это получить избавить от нулей. Если какой-то API (скорее всего, Java) может вернуть null, оберните его вызов в Option(), чтобы получить вместо него правильный Option. Если какой-то API должен быть передан null, передайте ему option.orNull.

Внутри вашего собственного кода ничего не должно быть null.

8 голосов
/ 05 июля 2011

Я бы все еще использовал Option здесь.Вы можете легко преобразовать потенциально нулевую переменную в Option, используя объект Option.например,

scala> def splitter(s: String) = Option(s) map { _.split(',') }
splitter: (s: String)Option[Array[String]]

scala> splitter("Here, are, some, strings, man.")
res50: Option[Array[String]] = Some([Ljava.lang.String;@7f4613f1)

scala> splitter(null)
res51: Option[Array[String]] = None
3 голосов
/ 05 июля 2011

Пустая строка уже возвращает пустой список - хорошо - массив:

scala> "".split (',')                                             
res59: Array[String] = Array()

возможен возврат нуля:

scala> val lst = if (words == null) null else words.split (',')     
lst: Array[String] = Array()

, но в большинстве случаев пустой список будет лучшене так ли?

scala> val lst = if (words == null) Array () else words.split (',') 
lst: Array[_ <: String] = Array()
1 голос
/ 05 июля 2011

В Scala нет прямого эквивалента оператору ?..

Самая краткая реализация в Scala без введения других символов , вероятно, будет

val lst = if( words == null ) Nil else words.split(',')

или, приведя к приведенному ниже улучшению,

val lst = (if( words == null ) "" else words).split(',')

В Scala общее правило разработки - избегать нулевых значений, когда это возможно, либо с помощью Option [], либо (как и в Java) с помощью одноэлементных резервных значений (здесь "", хотя Option является предпочтительным способом).,

Но так как вы, очевидно, заблокировали использование API, который возвращает нулевые значения, вы можете определить небольшую вспомогательную функцию для переноса результатов API.Вы можете попробовать маршрут "объекта отката" примерно так:

def safe(s:String) : String = if( s == null ) "" else s 
val lst = safe( words ).split(',')

или, немного более подробно, с помощью Option []:

def safe(s:String) : Option[String] = if( s == null ) None else Some(s) 
val lst = safe( words ) match { case None => Nil; case Some( w ) => w.split(',') }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...