告别NullPointerException:Scala中的Option

java.lang.NullPointerException,写过Java代码的人对于这一段异常一定不会陌生。如果说哪一个Java程序员没有遇到过这个异常,我想只有两种情况:1、这个人一定是一个计算机天才,逻辑思维缜密,业务逻辑清晰。2、这仁兄一定没写过代码,至少没有在实际开发中写过代码。

空指针异常的来源于null,而null在java中并不是一个实例或者一个类型,它只是Java的一个关键字,null代表的意义是在给定情形下没有任何值。所以,对它调用任何方法都是非法的。而null也是我们开发过程中很多bug的来源。我们常常在处理数据时忘记校验数据是否null。

Scala引入了Option,这是一个抽象类,它允许我们显式表示没有任何值这种情况,并且通过类型检查来避免空指针异常的发生。Option是一个抽象类,它有两个具体的子类Some和None。Some表示有值,None表示没有值(即null表示情况)。通过Option的类型判断,我们能很轻易的识别空指针,况且Scala也为我们提供了具体操作的API。下面我们以代码的角度来熟悉使用Option:

val stateCapitals = Map(
  "Alabama" -> "Montgomery",
  "Alaska"  -> "Juneau",
  // ...
  "Wyoming" -> "Cheyenne")

println( "Get the capitals wrapped in Options:" )
println( "Alabama: " + stateCapitals.get("Alabama") )
println( "Wyoming: " + stateCapitals.get("Wyoming") )
println( "Unknown: " + stateCapitals.get("Unknown") )

println( "Get the capitals themselves out of the Options:" )
println( "Alabama: " + stateCapitals.get("Alabama").get )
println( "Wyoming: " + stateCapitals.get("Wyoming").getOrElse("Oops!") )
println( "Unknown: " + stateCapitals.get("Unknown").getOrElse("Oops2!") )

运行结果:
Get the capitals wrapped in Options:
Alabama: Some(Montgomery)
Wyoming: Some(Cheyenne)
Unknown: None
Get the capitals themselves out of the Options:
Alabama: Montgomery
Wyoming: Cheyenne
Unknown: Oops2!
stateCapitals: scala.collection.immutable.Map[String,String] = Map(Alabama -> Montgomery, Alaska -> Juneau, Wyoming -> Cheyenne)

首先我们定义了Map的实例,用于保存美国的州于州首府的映射关系。而根据运行结果我们可以看出,Map.get方法并没有直接返回Map中存放元素,而是返回Some或者None。这与Java中Map的get有着实质的区别。通过Option,Map的返回值自动包装再Some对象中。相反,如果Map中不存在返回值,Map.get返回的是None对象。

注意事项

  1. 从Map获取的对象是保存到Option对象中,如果获取到值,则返回Some[T],否则返回None。
  2. Option.get是从Option中取出包装数据,但是如果Option为None,则会抛出NoSuchElementException。
  3. Scala提供了安全的取值方式,getOrElse替代get方法。如上:stateCapitals.get(“Wyoming”).getOrElse(“Oops!”),该方法在Some调用时,直接返回包装的值,如果是None调用,则返回参数中传入值。
  4. Map同样提供了类似第三条中安全的取值方式:stateCapitals.getOrElse(“Unknown”,”unknown”),如果Map中不包含“Unknown”的值,则返回第二个参数值,即“unknown”。

你可能感兴趣的:(scala)