【问题标题】:Scala Option vs Java null [duplicate]Scala Option vs Java null [重复]
【发布时间】:2011-10-01 10:06:32
【问题描述】:

可能重复:
Why Option[T] ?

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

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

我知道我可以使用 "match" 来处理这个问题。 我在这里需要了解 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] ! 想象一下,我必须返回一个字符串才能设置到我的 bean 变量中,该变量的类型为 String 而不是 Option[String]

如果没有任何类型的match,我怎么能做到这一点! 我想如果有什么东西让它起作用,那会让我很好地理解Option的力量。

【问题讨论】:

标签: scala


【解决方案1】:

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

当您有一些可能失败或可能未定义的计算时,这将非常有用。一个很好的例子是,如果您有一个 web 应用程序并且有一些用户数据未填写,因此计算无法运行。如果您在地图中有用户数据,您可以执行类似的操作

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

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

【讨论】:

  • 我刚刚开始感受到它的力量。谢谢。当然,如果您有更多要与我分享,请随意:)
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 2015-08-02
  • 1970-01-01
  • 2013-07-20
  • 2018-02-28
  • 2019-10-07
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多