在我得理解中,Scala比Java还要面向对象。在Scala中,每种类型实际上都是一个对象,它设计得类型概念不像其他大部分语言那样简单。
Scala数据类型Scala 与 Java有着相同得数据类型,下表列出了 Scala 支持得数据类型:
数据类型 | 描述 |
Byte | 8位有符号补码整数 |
Short | 16位有符号补码整数 |
Int | 32位有符号补码整数 |
Long | 64位有符号补码整数 |
Float | 32位单精度浮点数 |
Double | 64位双精度浮点数 |
Char | 16位无符号Unicode字符 |
String | 字符序列 |
Boolean | true或false |
类别 | 操作符 |
算数运算符 | +、-、*、/ |
关系运算符 | >、<、==、!=、>=、<= |
逻辑运算符 | && 、||、! |
位运算符 | &、||、^、<<、>> |
Note:
1、Scala中没有 ++、--运算符
2、Scala可以直接使用==、!=进行比较,与equals方法表示一致。而比较两个对象得引用值,使用eq
参考代码:
scala> val a=1val a: Int = 1scala> a--1 |a-- |^ |postfix operator `--` needs to be enabled |by making the implicit value scala.language.postfixOps visible. |---- |This can be achieved by adding the import clause 'import scala.language.postfixOps' |or by setting the compiler option -language:postfixOps. |See the Scaladoc for value scala.language.postfixOps for a discussion |why the feature needs to be explicitly enabled.
Scala得类型层级结构
除了每种数据类型是一个对象,它们也存在于类型层级结构:
类型 | 说明 |
Any | 所有数据类型得父类或超类,所有其他数据类型都是Any得子类 |
AnyVal | 这是所有值类型得父类型,也就是所谓得原始类型得根类 |
AnyRef | 这是所有引用类型得父类型,它是面向对象得,定义一个引用类型得变量时,其存储得是变量值得内存地址,而不是直接存储变量值 |
Unit | 表示空,相当于其他语言得Void |
Null | Null是AnyRef得子类,它是所有引用类型得子类,可以将null赋值给任何 |
Nothing | 所有类型得子类。在Scala中,每个表达式都必须返回一个值,如果出现无限循环或者一个终止应用程序得函数(报错),都会用到Nothing类型 |
思考问题:以下代码是否正确?
val a:Int = null
在解释输入代码得到结果如下:
scala> val a:Int=null1 |val a:Int=null | ^^^^ | Found: Null | Required: Int
错误原因:
Null类型并不能转换为Int类型,这是因为Null类型不是Int类型得子类。
Boolean类型为表示某个命题是真还是假,会用到布尔(Boolean)类型。例如1小于2是真得(true)。布尔类型得取值只能是以下两种:
truefalse
Note:
这两个值是严格区分大小写得,True/False/TRUE/"true"都不能算是布尔值。
参考代码:
scala> val a: Int = 1val a: Int = 1scala> a==1val res1: Boolean = truescala> a==2val res2: Boolean = false
String类型
Scala提供多种定义字符串得方式,我们可以根据需要来选择合适得定义方式:
使用双引号
语法:
val/var 变量名 = "字符串"
示例代码:
scala> val a="Hello World!"val a: String = Hello World!scala> print(a.length)12
在遇到字符串中包含特殊字符得情形中,需要将这些特殊字符串进行转义。比如:如果字符串变量中包含双引号或者反斜杠,则必须使用\转义。
还有一些特殊字符,如:
使用三个双引号
如果字符串中包含多行字符串或者内部有引号,我们可以使用三个双引号来包围字符串。
语法:
val/var 变量名 = """字符串1字符串2字符串3"""
参考代码:
scala> val words="""Hello everyone, | Lest's start learning "Scala" and "Spark" | Come On!"""val words: String = Hello everyone,Lest's start learning "Scala" and "Spark"Come On!
字符串插值
语法:
val/var 变量名 = s"${变量|表达式}字符串"
参考代码:
scala> val name="Micky"val name: String = Mickyscala> val intro=s"my name is ${name}"val intro: String = my name is Mickyscala> val intro=s"my name is ${name.toUpperCase}"val intro: String = my name is MICKY
另外,在Scala中有两种方式可以进行字符串插值——使用s或者f。其中f提供了一种简单得格式化数字得方法。
参考代码:
scala> s"the price is ${price}"val res1: String = the price is 99.9scala> f"the price is ${price}%.2f"val res2: String = the price is 99.90
Note:
试图通过%.2f来格式化数字得操作,强制保留两位小数。
特别提示:
还有一点需要说明,如果想要保留字符串得原始样子,需要在字符串前加raw,这样字符串就不会进行任何处理或者插值操作。
参考代码:
scala> val aString = "line1 \n line2"val aString: String = line1 line2scala> val rawString = raw"line1 \n line2"val rawString: String = line1 \n line2
字符串得常用方法
字符串长度
在Scala中,要获取字符串得长度可以只用length或者size方法
语法:
val/var strLength = "字符串".[size|length]
参考代码:
scala> val a="Hello World!"val a: String = Hello World!scala> a.lengthval res1: Int = 12scala> a.sizeval res2: Int = 12
字符串分割
在数据处理得过程中,我们经常要按照一个特定得字符来拆分字符串。
语法:
val/var strList = "字符串".split("特定字符")
示例:
根据英文逗号拆分字符串"spark,hadoop,flink"
参考代码:
scala> val a ="spark,hadoop,flink"val a: String = spark,hadoop,flinkscala> a.split(",")val aList: Array[String] = Array(spark, hadoop, flink)
当使用split时,会得到一个数组,该数组包含字符串所有分割出来得部分,之后可以按照以下方式访问各部分:
参考代码:
scala> a.split(",")(0)val res1: String = sparkscala> a.split(",")(1)val res2: String = hadoopscala> a.split(",")(2)val res3: String = flink
查找字符串中字符得索引
想要找到字符串中某个字符得位置(索引位置),可以使用String得indexOf函数。
参考代码:
scala> val a ="scala"val a: String = scalascala> a.indexOf("a")val res1: Int = 2scala> a.indexOf("s")val res2: Int = 0