1. 简介
Scala 是 Scalable Language 的简写,是一门多范式的编程语言。创始人为 Martin Odersky 马丁·奥德斯基。
Scala 这个名字来源于 Scalable Language(可伸缩的语言),它是一门基于 JVM 的多范式编程语言,通俗的说:Scala是一种运行在 JVM 上的函数式的面向对象语言。之所以这样命名,是因为它的设计目标是:随着用户的需求一起成长,Scala 可被广泛应用于各种编程任务,从编写小型的脚本到构建巨型系统,它都能胜任。正因如此,Scala 得以提供一些出众的特性,例如:它集成了面向对象编程和面向函数式编程的各种特性,以及更高层的并发模型。
总而言之,Scala 融汇了许多前所未有的特性,同时又运行于 JVM 之上,随着开发者对 Scala 的兴趣与日俱增,以及越来越多的工具的支持,无疑 Scala 语言将成为一门必不可少的工具。
总结:
Scala 是兼容的:兼容 Java,可以访问庞大的 Java 类库;
Scala 是精简的:Scala 表达能力强,一行代码抵得上多行 Java 代码,开发速度快。可以让程序短小精悍,看起来更简洁,更优雅;
Scala 是静态类型的:Scala 拥有非常先进的静态类型系统,支持类型推断和模式匹配等;
Scala 可以开发大数据应用程序:例如 Spark、Flink 等。
2. 环境搭建
Scala 2.12.17 官网下载:https://www.scala-lang.org/download/2.12.17.html
双击 msi 安装包,记住安装的路径方便后续配置环境变量。
IntelliJ IDEA 安装插件
3.HelloWorld
4. 基础语法
4.1. 注释
//单行
/*
多行
*/
/**
* 文档
**/
4.2. 语句
4.3. 打印输出
4.4. 常量
val修饰 常量名:常量类型
val name :string ="张三";
name 不可变, val相当于java的final
4.5. 变量
var 变量名:变量类型=初始值;
官方推荐使用val:
更安全;
代码可读性高;
资源回收更快,方法执行完,val所定义的常量就会被收回。
4.6. 字符串
4.6.1. 双引号
val|var 变量名 = "字符串"
4.6.2. 三引号
val|var 变量名 = """
字符串1
字符串2
"""
方面字符串写在多行;
val sql = """
SELECT ename, job, sal
FROM emp
WHERE empno = 1234;
"""
println(sql)
4.6.3. 插值表达式
val|var 变量名 = s"${变量|表达式}字符串"
4.6.4. 惰性赋值
lazy val 变量名 = 表达式
只支持val,不支持var
类似懒加载,只有当首次使用时才会将数据读入内存;
4.7. 标识符
实际开发中,我们会编写大量的代码,这些代码中肯定会有变量、常量、方法、类等,那它们该如何命名呢?这就需要标识符了,标识符就是用来给变量、常量、方法、类等起名字用的。
4.7.1. 命名规则
不能数字开头;
不能使用关键字;
4.7.2. 命名规范
变量和方法:小驼峰,maxSize、selectUserById;
类和特征(Trait):大驼峰,UserController、WordCount;
包:全部小写。
4.8. 数据类型
注意事项:
Scala 所有类型都使用大写字母开头
整型使用 Int 而不是 Integer
Scala 中定义变量可以不写类型,让 Scala 编译器自动推断
Scala 中默认的整型是 Int,默认的浮点型是 Double。
4.9. 类型转换
4.9.1. 自动类型转换
val a:Double = 3 + 2.21
4.9.2. 强制类型转换
val a:Double = 3.14
val b:Int = a.toInt
4.9.3. String 类型转换
val|var 变量名 = 数值类型 + ""
val|var 变量名 = 数值类型.toString
4.10. 键盘录入
4.11. 运算符
4.11.2. 算术运算符
4.11.3. 赋值运算符
4.11.4. 关系运算符
4.11.5. 逻辑运算符
4.12. 语句块
Scala 中使用 {} 表示一个语句块,语句块是有返回值的(最后一个逻辑行)。例如:
4.13. 流程控制
4.14. 循环结构
循环指的是事务周而复始的变化,代码中指的是某部分代码满足一定的条件时则反复执行直到条件不满足为止。例如打印十次 HelloWorld,如果没有循环结构则需要写十遍该代码,有了循环结构则只需要写一次即可。
守卫
yield 生成器
yield 是一个类似 return 的关键字,但是 yield 不会结束函数,而 return 会结束函数。如果在循环结构中使用了 yield,相当于迭代一次遇到 yield 时就将 yield 后面(右边)的值放入一个集合,最后整个循环结束时将集合返回。我们把使用了yield 的 for 表达式称之为推导式。yield 不仅可以使用于 for 循环中,还可以使用于某个函数的参数,只要这个函数的参数允许被迭代。
4.15. 方法
4.15.1. 语法格式
4.15.2. 类型推断
在 Scala 中,定义方法时返回值类型可以省略,由 Scala 编译器自动推断。但是定义递归方法时,不能省略。否则会报错: error: recursive method accumulation needs result type 。
4.15.3. 惰性方法
当记录方法返回值的变量被声明为 lazy 时,方法的执行将会被推迟,直到我们首次使用该值时,方法才会执行。这样的方法叫做惰性方法。
4.15.4. 方法参数
带名参数
变长参数
4.15.5. 方法调用
后缀调用法
对象名.方法名(参数) Math.abs(-1)
中缀调用法
对象名 方法名 参数 Math abs -1 、 Math max (1, 2)
花括号调用法
无括号调用法
4.16. 函数
4.16.1. 定义函数
4.16.2. 方法和函数的区别
方法是隶属于类或者对象的,在运行时,它会被加载到 JVM 的方法区中
函数是一个对象,继承自 FunctionN,函数对象有 apply,curried,toString,tupled 这些方法,方法则没有。
4.16.3. 方法转换为函数
val|var 变量名 = 方法名 _
4.17. Option
4.17.1. 语法格式
4.17.2. 案例