scala 基础(一)

Posted by leonardBang's Blog on April 17, 2017

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 =>
}