19

Scala 基础 - 语法特性 (一):类型和变量

 3 years ago
source link: https://xie.infoq.cn/article/681da2c59a34bfa476c804ca1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

统一类型

在数据类型方面Scala与Java的最大区别在于: Scala没有所谓的基本数据类型,秉承一切皆对象的彻底性,所有的数据类型和函数都是以对象的形式存在。 Scala类型层次结构:

ZriEVvu.jpg!mobile

Any是所有类型的超类,也称顶级类型,它定义了一些通用的方法如equals、hashCode和toString,Any有两个之间的子类AnyValue和AnyRef。

  • AnyVal代表值类型,它有9个预定义的非空的值类型,分别是Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是不带任何意义的类型,Unit可以作为返回类型。

  • AnyRef代表引用类型,所有非值类型都被定义为引用类型,用户声明的自定义类型都属于AnyRef引用类型的子类型,同时在Java运行环境中调用Scala。AnyRef会被当做java.lang.Object基类。

Nothing是所有类型的子类型,包括值类型和引用类型,同时Nothing也是Null的子类型,也称为底部类型。没有一个值是Nothing类型的。Nothing类型通常用于程序非正常结束的信号,可以被理解为不定义值的表达类型,在非正常返回时使用。这点与Java中返回Null,C++中用-1作为返回符类似。

Null是所有引用类型的子类型(即AnyRef的任意子类型),它有一个单例值由关键字Null所定义。Null主要是使得Scala满足和其他JVM语言的互操作性,但是null是非常容易引发程序崩溃,同时Scala也采用了各种机制来避免使用Null类型。

下面实现将各种类型的数据存放在List中,并进行遍历打印:

package HelloScala

object HelloScala {
def main(args: Array[String]): Unit = {
val list:List[Any] = List(
"A String", // 字符串
68, // 整形
"c", // 字符
"""Hello,
Nice to meet you""", // 多行字符串
() => "an anonymous function returning a string" // 函数
)
list.foreach(element => println(element))
}
}

变量

Scala的变量声明和Java有很大区别,Scala变量可分为

  • 变量,指的是在程序运行过程中值可能会改变的量,用关键词 var 声明。

  • 常量,指的是程序运行中值不会发生改变的量,使用关键词 val 声明常量,如果对常量修改在编译时会报错。

Scala支持语法糖,可以像Python一样省略变量类型,编译器自动根据变量和常量的初始值推测类型。

object HelloScala {
defmain(args: Array[String]): Unit= {
// 变量,可以被修改
varmyVar : String ="Spark Streaming"
// 常量,不可修改,若修改,编译会报错
val myVal : String ="Spark Streaming"
myVar ="Action"
println(myVar +", "+ myVal)
// 语法糖,编译器自动根据变量和常量的初始值推测类型
varage =18
}
}

参考资料

  • 书籍《Spark Streaming 实时流式大数据处理实战》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK