Scala Option vs Java null

时间:2011-07-08 16:13:21

标签: scala

  

可能重复:
  Why Option[T] ?

我是Scala的新手,我无法真正感受到java与Java上的null和Scala上的Option之间的区别。 我知道没有一个是对象,如果我在Scala上写这样的smth,它会安全的:

val map = Map("koko" -> "is a cat")
val string:Option[String] =map.get("other")
println(string.map(a=>println(a.toString)) )

我得到None而不是抛出异常。 这很有趣。

但是,如果我需要返回值不被Some包裹。我将使用.get来返回值。

在我们的例子中,它会抛出异常:

map.get("other").get.map(a=>println(a.toString))

我知道我可以通过使用“匹配”来解决这个问题。 我正在这里,我需要了解Scala上的选项对于java上的null有什么兴趣!

我仍然无法得到的是我如何使用Option的优势但是如果我的变量中存在值,则返回值Some(value)

def testOption(): String = {
  val map = Map("koko" -> "is a cat")
  val string: Option[String] = map.get("koko")
  string
}

我的意思是有没有办法让这段代码有效,而不是将返回值更新为Option[String]! 想象一下,我必须返回一个String,以便设置为我的bean变量,其类型为String而不是Option[String]

我怎么能在没有任何match的情况下完成这项工作!! 我想如果有什么能使它有效,那将使我更好地理解Option的力量。

1 个答案:

答案 0 :(得分:6)

选项实际上非常有用。在Java中,很难记录某些东西是否可以为空。在Scala中,您通常可以假设所有变量都不为空。

当您有一些可能失败或无法定义的计算时,这非常有用。一个很好的例子是,如果你有一个webapp并且有一些用户数据未填写,那么计算就无法运行。如果您在地图中拥有用户数据,则可以执行类似

的操作
val myData = map.get(userId).map(doFunction).map(toHtml)
println(myData.getOrElse(noDataHtml))

很明显,我们永远不必担心null。如果用户数据在地图中,我们继续计算,然后将其转换为html。否则,我们只打印出默认的html。在Java中,在每个阶段我们都必须进行空检查,但在Scala中我们只能链接函数。