可能重复:
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
的力量。
答案 0 :(得分:6)
选项实际上非常有用。在Java中,很难记录某些东西是否可以为空。在Scala中,您通常可以假设所有变量都不为空。
当您有一些可能失败或无法定义的计算时,这非常有用。一个很好的例子是,如果你有一个webapp并且有一些用户数据未填写,那么计算就无法运行。如果您在地图中拥有用户数据,则可以执行类似
的操作val myData = map.get(userId).map(doFunction).map(toHtml)
println(myData.getOrElse(noDataHtml))
很明显,我们永远不必担心null。如果用户数据在地图中,我们继续计算,然后将其转换为html。否则,我们只打印出默认的html。在Java中,在每个阶段我们都必须进行空检查,但在Scala中我们只能链接函数。