Scala中的Option
避免null使用
大多数语言都有一个特殊的关键字或者对象来表示一个对象引用的是“无”,在Java,它是null
。
写Java程序的时候,经常会碰到没有有意义的东西可以返回,我们返回null。
在Java 里,null
是一个关键字,不是一个对象,所以对它调用任何方法都是非法的。因此调用方必须检查返回值,不然会有NullPointerException的异常。
这逼迫我们去check函数的返回值,或者捕获异常。这都不是明智的选择。
同时还有一个例子
Map<String, String> map = ???
String valFor2014 = map.get(“1024”); // null
if (valFor1024 == null)
abadon();
else doSomething();
null到底代表key找不到还是说1024对应的值就是null?在有些时候,会产生具有二义性的代码。
Scala的Option类型
为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。
- Option可以看作是一个容器,容器的size是1或0;
- size为1的时候,即有值可以引用,就是一个
Some[A](x: A)
,如Some[String]
; - size为0的时候,即没有值的情况下就是一个
None
,它是Option的一个子类。None被声明为一个对象,而不是一个类,因为我们只需要它的一个实例。这样,它多少有点像null关键字,但它却是一个实实在在的,有方法的对象。
应用例子
Option类型的值通常作为Scala集合类型(List,Map等)操作的返回类型。比如Map的get方法:
scala> val capitals = Map("France"->"Paris",