注释

Scala注释和Java完全一样。

变量和常量

在 Scala 中,使用关键词 “var” 声明变量,使用关键词 “val” 声明常量
变量基本语法:

  1. // var 变量名 [:变量类型] = 初始值
  2. // 例如:
  3. var a: Int = 10

常量基本语法:

  1. // val 常量名 [:常量类型] = 初始值
  2. // 例如
  3. val b: Int = 20

Scala是强类型语言,类型虽然可以不显式声明,但是Scala进行类型推断后不允许修改。

  1. var c = 10
  2. c = new Date() // 此处会报错,因为c被推断为Int类型

变量声明时,必须要有初始值

  1. // 以下代码在类上会报错,要求把变量d或者类声明为abstract类型,否则需要将d设置初始值
  2. var d:Int
  3. d = 10

标识符命名规范

Scala的标识符声明,和 Java 基本一致,细节上有些变化。

  • 以字母或下划线开头,后接字母、数字、下划线
  • 以操作符开头,且只包含操作符(+-*/#!等)
  • 以反引号```` 包围的任意字符(即使是Scala的39个关键字也可以)

示例:

  1. var _aaa = 123 // 普通的变量名
  2. var +- = 123 // 操作符变量名
  3. var `var` = 123 // 反引号包围的变量名

在Scala中,是纯粹的面向对象,即使是+-这些操作符也都是对象。以操作符做变量名就是为了面向对象。

字符串操作

(1)字符串,通过+号连接
(2)printf 用法:字符串,通过%传值。
(3)字符串模板(插值字符串):通过$获取变量值

字符串和其他类型拼接:

  1. val str = "aaa"
  2. val a:Int = 10
  3. println(str + a) // aaa10

将字符串重复n次输出:

  1. // 输出10个*
  2. println("*" * 10) // **********

使用printf格式化输出:

  1. val str = "aaa"
  2. val a:Int = 10
  3. printf("接收到报文:%s,长度:%d", str, a) // 字符串,通过%传值。

字符串模板:s、f、raw是固定不能变的

  1. val str = "aaa"
  2. val strTemplate = s"msg: ${str}" // 使用s开头的字符串模板
  3. println(strTemplate) // msg: aaa
  4. val pi: Float = 3.1415926f
  5. val template2 = f"pi is ${pi}%2.2f" // 使用f开头的字符串模板(可以进行格式化输出)
  6. println(template2) // pi is 3.14
  7. val template3 = raw"pi is ${pi}" // 使用 raw 开头的字符串模板(原始格式输出)
  8. println(template3) // pi is 3.1415925

三引号换行:

  1. val strMulLine =
  2. """ // 使用三个引号可以进行换行
  3. |select * // 换行时每行前面会有一个竖线
  4. |from
  5. | emp
  6. |where
  7. | name='JACK'
  8. |""".stripMargin // 使用stripMargin可以不输出竖线,只输出竖线后面的内容,保留换行的格式
  9. println(strMulLine)

三引号也可以配合 sfraw这些字符串模板使用。

获取输入

获取标准输入(键盘输入)

语法:

  1. StdIn.readLine()
  2. StdIn.readShort()
  3. StdIn.readDouble()

示例:

  1. import scala.io.{Source, StdIn}
  2. println("请输入:")
  3. val str = StdIn.readLine()
  4. println(str)

读写文件

从文件读取数据:

  1. import scala.io.{Source, StdIn}
  2. Source.fromFile("/app/WordCount/input/aaa.txt").foreach(print) // 从文件读取
  3. Source.fromURL("https://www.baidu.com").foreach(print) // 从URL读取

写入文件同Java:

  1. val writer = new PrintWriter(new File("src/main/resources/output.txt"))
  2. writer.write("hello world")
  3. writer.close()

数据类型

Scala中的数据类型

在Java中,存在8个基本类型,而且基本类型不是java对象类型,虽然后面产生了基本类型的包装类,但是仍然存在基本数据类型,所以Java并不是真正意义上的纯粹的面向对象。

Java中的基本类型和引用类型没有共同的祖先。

在Scala中,一切数据都是对象,都是 Any 的子类。

Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef)。不管是数值类型还是引用类型,都是对象类型。

Scala中的StringOps是对Java中的String的增强。

Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是一个数据类型,只有一个对象就是()Void不是数据类型,只是一个关键字。

Null 是一个类型,只有一个对象就是null。它是所有引用类型(AnyRef)的子类。

Nothing是所有类型的子类型,也称为底层类型。没有具有type值的Nothing。它比较常见的用途是发出非终止信号(例如抛出异常、程序退出等),即它是一种不计算为值的表达式,或者一种不正常返回的方法。

Scala中的数据类型:

unified-types.svg

整数类型

Scala中的整数类型 ByteShortIntLong

数据类型 字节数 描述
Byte 1 8位有符号补码整数。-128 ~ 127
Short 2 16位有符号补码整数。-32768 ~ 32767
Int 4 32位有符号补码整数。
Long 8 64位有符号补码整数。

浮点类型

单精度浮点型Float,双精度浮点型Double

字符类型

Char 表示单个字符。

布尔类型

Boolean类型,只占一个字节。

Unit、Null、Nothing

数据类型 描述
Unit 表示无值,等同于其他语言的void
。用作不返回任何结果的方法的结果类型。Unit
只有一个实例值,写成()
Null null。Null类型只有一个实例值null
Nothing Nothing在Scala类层级的最低端,是任何其他类型的子类型。当一个函数确定没有正常的返回值,可以用Nothing来指定返回类型,这样我们可以把返回的值(异常)赋给其他的函数或变量(兼容性)

类型转换

数值类型自动转换

Scala数据类型仍然遵守:低精度的值类型向高精度类型自动转换(隐式转换)。

和 Java 相同,隐式转换图:

type-casting.svg

byteshortchar之间不能自动转换,但是可以通过转换成int进行计算。

Scala还提供了隐式转换机制(隐式函数、隐式类)

强制类型转换

Scala的强制类型转换和 Java 的写法不同:
Java 强制类型转换:

  1. // 使用小括号进行强制类型转换
  2. int num = (int) 3.14

Scala强制类型转换:

  1. // 把数值当做一个对象,调用 toInt 进行转换
  2. var num: Int = 3.14.toInt

数值和字符串转换

示例:

  1. // 数字转字符串
  2. val n: Int = 12
  3. val str: String = n + "" // 直接拼接字段串
  4. val str2: String = n.toString // 通过toString转换
  5. // 字符串转数值
  6. val str3 = "12"
  7. val num: Int = str3.toInt