Groovy语言有?处理NullPointer异常的语法,scala中有类似的东西吗?

时间:2011-07-05 13:21:17

标签: java scala groovy

假设我有来自查询字符串请求参数的String参数。如您所知,参数可能丢失或可能存在,但值为空字符串。 在groovy语言中,我可以简单地执行类似

的操作
  List lst = words?.split(',') 

如果单词为null,则lst将为null而不是抛出NPE

scala中的类似快捷方式是什么?

Option [String]不是一个选项,因为它是来自查询字符串的字符串类型为String。

4 个答案:

答案 0 :(得分:14)

如果你想保留空值,

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

但你应该做的是获取 rid 的空值。如果某些API(Java,很可能)可能返回null,请将其调用包裹在Option()中,以获得正确的Option。如果某个API需要传递null,请将其传递给option.orNull

在您自己的代码中,不要让任何内容为null

答案 1 :(得分:8)

我仍然会在这里使用Option。您可以使用Option对象轻松地将可能为空的变量转换为Option。 e.g。

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

答案 2 :(得分:3)

空String已返回空List - well - Array:

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

可以返回null:

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()

答案 3 :(得分:1)

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(',') }