• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Scala中优雅的处理Null问题

java 搞代码 4年前 (2022-01-09) 14次浏览 已收录 0个评论
文章目录[隐藏]

前言

如果在scala代码还在使用ids!=null,可能会被有的人嘲笑,都什么年代了,竟然还有这样的写法,NullPointerException见少了吧?
不过,据统计:
Spark 源代码使用了 821 次 Option 关键字,但它也直接在像if (ids != null)。

Spark 采用混合方式,大部分情况下使用 Option,但个别时候出于性能(这里主要是为了给使用这返回提示信息)原因才使用了null。

一个很好的习惯是当有方法返回值可能为null的时候,使用Option来代替。

什么是Option

标准类库中Option类型用样例类来表示那种可能存在、也可能不存在的值
Option的有两个子类,Some 和 None,Some包装了某个值,如Some(“Jack”),而None表示没有值。

有的小伙伴看到依然云里雾里的,因此直接上一个简单的例子,来感受一下这个Option究竟是什么东西:

煮个栗子

这里写了一个把字符串转为数值的方法,输入的是字符串,输出的这里注意一下,并不是直接输出Int,而且一个泛型为Int的Option

def toInt(in: String): Option[Int] = {
  try {
    Some(Integer.parseInt(in.trim))
  } catch {
    case e: NumberFormatException => None
  }
}

如何使用这个函数:

toInt("s") match {
  case Some(i) => println(i)
  case None => println("您输入的字符串无法转为数字")
}

简单的总结一下这个Option的使用,其实就是把你原本要返回的类型,直接返回泛型为该类型的Option,然后写正常返回值的时候返回Some,异常的时候返回None即可。而调用方法的时候,需要用到match case分别做处理。

有人看到这里可能会抱怨:一个简单的null判断,写了这么一大堆,还不如java中的直接用i!=null来判断简单粗暴呢。

但是如果这个toInt函数是别人写的,你是个使用者,你一定会遇到如下问题:

  • 你没有读API文档,根本不知道toInt可能会返回一个null,并且可能你写的代码会抛出NullPointerException
  • 你读了API文档,并且也有很多使用这个函数的经验,知道它可能会返回null,因此你肯定会写如下代码来处理可能出现的空指针异常
Integer i = toInt(someString);
if (i == null) {
    System.out.println("您输入的字符串无法转为数字");
} else {
    System.out.println(i);
}

该代码并不比 Scala的Option和match方法差,但你确实必须阅读API文档本文来源gaodaima#com搞(代@码$网6才能知道必须得这样处理。

3.当然还可以通过抛出NumberFormatException来处理null或者其他一些异常情况

Option的好处不仅如此

比如想统计下面list中的总和,这些字符串有的可以转为Int,有的不可以

val bag = List("1", "2", "foo", "3", "bar")

要实现这个需求,感觉要写很多代码才能实现,其实在scala中只要一行代码就可以实现:

val sum = bag.flatMap(toInt).sum

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Scala中优雅的处理Null问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址