假设我有来自查询字符串请求参数的String参数。如您所知,参数可能丢失或可能存在,但值为空字符串。 在groovy语言中,我可以简单地执行类似
的操作 List lst = words?.split(',')
如果单词为null,则lst将为null而不是抛出NPE
scala中的类似快捷方式是什么?
Option [String]不是一个选项,因为它是来自查询字符串的字符串类型为String。
答案 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(',') }