注释
变量和常量
在 Scala 中,使用关键词 “var” 声明变量,使用关键词 “val” 声明常量。
变量基本语法:
// var 变量名 [:变量类型] = 初始值
// 例如:
var a: Int = 10
常量基本语法:
// val 常量名 [:常量类型] = 初始值
// 例如
val b: Int = 20
Scala是强类型语言,类型虽然可以不显式声明,但是Scala进行类型推断后不允许修改。
var c = 10
c = new Date() // 此处会报错,因为c被推断为Int类型
变量声明时,必须要有初始值
// 以下代码在类上会报错,要求把变量d或者类声明为abstract类型,否则需要将d设置初始值
var d:Int
d = 10
标识符命名规范
Scala的标识符声明,和 Java 基本一致,细节上有些变化。
- 以字母或下划线开头,后接字母、数字、下划线
- 以操作符开头,且只包含操作符(
+
、-
、*
、/
、#
、!
等) - 以反引号```` 包围的任意字符(即使是Scala的39个关键字也可以)
示例:
var _aaa = 123 // 普通的变量名
var +- = 123 // 操作符变量名
var `var` = 123 // 反引号包围的变量名
在Scala中,是纯粹的面向对象,即使是+
、-
这些操作符也都是对象。以操作符做变量名就是为了面向对象。
字符串操作
(1)字符串,通过+号连接
(2)printf 用法:字符串,通过%传值。
(3)字符串模板(插值字符串):通过$获取变量值
字符串和其他类型拼接:
val str = "aaa"
val a:Int = 10
println(str + a) // aaa10
将字符串重复n次输出:
// 输出10个*
println("*" * 10) // **********
使用printf
格式化输出:
val str = "aaa"
val a:Int = 10
printf("接收到报文:%s,长度:%d", str, a) // 字符串,通过%传值。
字符串模板:s、f、raw是固定不能变的
val str = "aaa"
val strTemplate = s"msg: ${str}" // 使用s开头的字符串模板
println(strTemplate) // msg: aaa
val pi: Float = 3.1415926f
val template2 = f"pi is ${pi}%2.2f" // 使用f开头的字符串模板(可以进行格式化输出)
println(template2) // pi is 3.14
val 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 = 12
val str: String = n + "" // 直接拼接字段串
val str2: String = n.toString // 通过toString转换
// 字符串转数值
val str3 = "12"
val num: Int = str3.toInt