1.scala的Option与Some
- 意义:scala 中使用Option、Some、None都是为了避免null的使用,比如java中,一个没有引用值的变量就是null,经常需要出里NPE问题,scala使用Option类来解决这一类问题
scala的Option类型:
为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用 Option 类型。在没有值的时候,使用 None ,这是Option的一个子类。如果有值可以引用,就使用 Some 来包含这个值。Some 也是 Option 的子类。
使用场景:
Option有两个子类别,Some和None。当程序回传Some的时候,代表这个函式成功地给了你一个String,而你可以透过get()函数拿到那个String,如果程序返回的是None,则代表没有字符串可以给你。 在返回None,也就是没有String给你的时候,如果你还硬要调用get()来取得 String 的话,Scala一样是会抛出一个NoSuchElementException异常给你的。 我们也可以选用另外一个方法,getOrElse。这个方法在这个Option是Some的实例时返回对应的值,而在是None的实例时返回传入的参数。换句话说,传入getOrElse的参数实际上是默认返回值
1
2
3
4
def showCapital(x: Option[String]) = x match {
case Some(s) => s
case None => "?"
}
2. Scala 的访问修饰符可以添加作用域参数。
作用域的语法如下:
private[x]或protected[x]
其中 x 代表某个包,类或者对象,表示可以访问这个 Private 或的 protected 的范围直到 X。 类 Navigator 使用 private[bobsrockets] 来修饰,这表示这个类可以被 bobsrockets 中所有类型访问, 比如通常情况下 Vehicle 无法访问私有类型 Navigator,但使用包作用域之后,Vechile 中可以访问 Navigator。
3. scala中case \_:
表示只判断类型一致,对于都是DecimalType但是有不同精度的DecimalType时比较有用,此外对于一些泛型的匹配,也可以用这个
case a : List[\_] =>
1
2
3
4
5
6
dataType match {
case DoubleType => schemaBuilder.doubleType()
case _: DecimalType => schemaBuilder.stringType()
case StringType => schemaBuilder.stringType()
case other => throw new IncompatibleSchemaException(s"Unexpected type $dataType.")
}
4. 这两个匹配等价,@用于将值绑定给变量
1
2
3
4
5
6
7
8
9
o match {
case Some(x) => println(x)
case None =>
}
o match {
case x @ Some(_) => println(x)
case None =>
}