注释
变量和常量
在 Scala 中,使用关键词 “var” 声明变量,使用关键词 “val” 声明常量。
变量基本语法:
// var 变量名 [:变量类型] = 初始值// 例如:var a: Int = 10
常量基本语法:
// val 常量名 [:常量类型] = 初始值// 例如val b: Int = 20
Scala是强类型语言,类型虽然可以不显式声明,但是Scala进行类型推断后不允许修改。
var c = 10c = new Date() // 此处会报错,因为c被推断为Int类型
变量声明时,必须要有初始值
// 以下代码在类上会报错,要求把变量d或者类声明为abstract类型,否则需要将d设置初始值var d:Intd = 10
标识符命名规范
Scala的标识符声明,和 Java 基本一致,细节上有些变化。
- 以字母或下划线开头,后接字母、数字、下划线
- 以操作符开头,且只包含操作符(
+、-、*、/、#、!等) - 以反引号```` 包围的任意字符(即使是Scala的39个关键字也可以)
示例:
var _aaa = 123 // 普通的变量名var +- = 123 // 操作符变量名var `var` = 123 // 反引号包围的变量名
在Scala中,是纯粹的面向对象,即使是+、-这些操作符也都是对象。以操作符做变量名就是为了面向对象。
字符串操作
(1)字符串,通过+号连接
(2)printf 用法:字符串,通过%传值。
(3)字符串模板(插值字符串):通过$获取变量值
字符串和其他类型拼接:
val str = "aaa"val a:Int = 10println(str + a) // aaa10
将字符串重复n次输出:
// 输出10个*println("*" * 10) // **********
使用printf格式化输出:
val str = "aaa"val a:Int = 10printf("接收到报文:%s,长度:%d", str, a) // 字符串,通过%传值。
字符串模板:s、f、raw是固定不能变的
val str = "aaa"val strTemplate = s"msg: ${str}" // 使用s开头的字符串模板println(strTemplate) // msg: aaaval pi: Float = 3.1415926fval template2 = f"pi is ${pi}%2.2f" // 使用f开头的字符串模板(可以进行格式化输出)println(template2) // pi is 3.14val template3 = raw"pi is ${pi}" // 使用 raw 开头的字符串模板(原始格式输出)println(template3) // pi is 3.1415925
三引号换行:
val strMulLine =""" // 使用三个引号可以进行换行|select * // 换行时每行前面会有一个竖线|from| emp|where| name='JACK'|""".stripMargin // 使用stripMargin可以不输出竖线,只输出竖线后面的内容,保留换行的格式println(strMulLine)
三引号也可以配合 s、f、raw这些字符串模板使用。
获取输入
获取标准输入(键盘输入)
语法:
StdIn.readLine()StdIn.readShort()StdIn.readDouble()
示例:
import scala.io.{Source, StdIn}println("请输入:")val str = StdIn.readLine()println(str)
读写文件
从文件读取数据:
import scala.io.{Source, StdIn}Source.fromFile("/app/WordCount/input/aaa.txt").foreach(print) // 从文件读取Source.fromURL("https://www.baidu.com").foreach(print) // 从URL读取
写入文件同Java:
val writer = new PrintWriter(new File("src/main/resources/output.txt"))writer.write("hello world")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中的数据类型:
整数类型
Scala中的整数类型 Byte、Short、Int、Long。
| 数据类型 | 字节数 | 描述 |
|---|---|---|
| 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 相同,隐式转换图:
byte、short、char之间不能自动转换,但是可以通过转换成int进行计算。
Scala还提供了隐式转换机制(隐式函数、隐式类)
强制类型转换
Scala的强制类型转换和 Java 的写法不同:
Java 强制类型转换:
// 使用小括号进行强制类型转换int num = (int) 3.14
Scala强制类型转换:
// 把数值当做一个对象,调用 toInt 进行转换var num: Int = 3.14.toInt
数值和字符串转换
示例:
// 数字转字符串val n: Int = 12val str: String = n + "" // 直接拼接字段串val str2: String = n.toString // 通过toString转换// 字符串转数值val str3 = "12"val num: Int = str3.toInt
