src
scala完全面向对象,本身没有null
这个概念,为了跟java整合,才允许java的null出现。scala使用None来描述无
这个状态。那么在代码中如何使用呢?
涉及到无
的操作:
- 方法返回值:Unit
- Nothing
- Nil
- None
- Null null
Option类似于IO流,主要封装动作,Option把非空判断
的行为进行了封装。Option本身就是个容器,也有容器接口的一些方法,当然这些方法正常是用不到的。Option就是个None判断器,无论什么对象,只要扔进去,就能通过其API判断这个对象是否为None,类似于验钞机。
traps
1. 巨坑!!!
Option的isDefined和isEmpty是根据是否是Some对象返回boolean,但Some(null)返回的仍然是Some对象,所以isDefined返回的是true。因此,判断一个可能为空
的对象是否为空时,一定要用Option来封装
@Test
def testNull(): Unit = {
println(Some(null).getClass + " | " + Some(null).isDefined) //输出:scala.Some | true
println(Option(null).getClass) //输出:scala.None$
}
错误示范
正确示范
com
只有2个实例,Some和None,表示有和无,只要是Option类型的变量,都可以接收Some和None实例。
一个变量是Option类型,就表示这个变量有可能是None,这个变量里面可以获取到希望得到的对象。是对对象的装饰。
是个用来处理非空判断逻辑的容器。只要是有可能为空
的,都可以放到这里面来,朝外拿的时候,就已经完成为非空判断,只需要调用API得到结果即可。类似于验钞机,不管真假钞,都可以放进去,取的时候,就能知道放进去的是真是假了。
usage
fun | desc |
---|---|
get | None调用会报错NoSuchElementException |
getOrElse | |
isEmpty | 检测可选类型值是否为 None,是的话返回 true,否则返回 false |
isDefined | 如果可选值是 Some 的实例返回 true,否则返回 false |
exists | 如果可选项中指定条件的元素存在且不为 None 返回 true,否则返回 false |
map |
example
{1} 声明一个变量,然后根据情况赋值。
编程中最常遇到的一个逻辑,
String str = null;
if (true) str = "a"; else str = "b";
str.xxx;
java中好解决,因为有null
。scala中也可以使用null,但更规范的用法是使用Option类型的None来表示当前变量仅仅是个空壳,没有意义。
scala:如果为true,就赋Some(RDD),否则,赋另外1个RDD。需要拐弯的就是变量的类型是个Option,RDD是包装在里面的。
var opRdd:Option[RDD[Int]] = None//这里一定要显式的声明类型,不然会认为是None类型。
if(1 + 1 == 2){
opRdd = Option(sc.parallelize(1 to 10 ))
//或者 opRdd = Option(sc.parallelize(1 to 10 ))
}
println(opRdd.getOrElse(sc.parallelize(11 to 20 )).foreach(println(_)))
{2} 有时java代码确实返回了null,此时可以用Option(null)把null转成scala的None
println(Option(null).equals(None)) //true
println(Option(null)) //true
println(None) //true
{3} Option对象进行match
option match {
case Some(name) => println(s"Received donut name = $name")
case None => println(s"No donut name was found!")