Java 的编译和解释执行:
javac xxx.java
java xxx.class
Scala 的编译和解释执行:
scala xxx.scala
scala xxx.class
# 还有一个 xxx$.class
构造方法私有化:
单例模式(只实例化一次)
object 伴生对象(class case class)
Scala 没有 static 关键字,取而代之的是 object,比 Java 更加面向对象
多看源码,多看文档
Scala 的注释和 Java 完全一样
Ctrl + Alt + L 进行格式化
一行不超过 80 或 100 个字符
变量和常量
var i:Int = 0 // 变量
val j:Int = 0 // 常量
能使用常量的地方,不适用变量
在函数式编程中,推荐使用常量(在数学中,不存在“变量”这个概念)
Scala 是强类型语言(这一点和 JavaScript 不一样)
class 和 case class 的区别
case class 可以直接访问构造参数
Scala 关键字(39 个),即使是关键字,通过反引号包裹之后也可以作为变量名
以操作符开头,且只包含操作符,也可以作为变量名(±*/#)等
Scala 的大多数对象也都实现了 toString
的方法
- 可以复制多次拼接
(1)
println
(2)
printf()
(3) 字符串模板
println(s"${}“)
println(f”${age}岁的${name}在BUAA学习") 比 s 多了一个格式化功能
println(raw"…") 只做替换,其他原样输出
println()
三引号可以原样表示字符串
val sql = s"""
|select *
|from
| student
|where
| name = ${name}
|and
| age > ${age}
|""".stripMargin
println(sql
Scala 输入输出
import scala.io.StdIn
object Test05_StdIn {
def main(args: Array[String]): Unit = {
println("请输入你的名字:")
val name: String = StdIn.readLine()
val age: Int = StdIn.readInt()
}
}
文件 IO
读取:Source
写入:调用 Java 的 PrintWriter 和 File
Source
Scala 数据类型
低精度向高精度转换,隐式转换
StringOps 是值类型,是对 Java String 的优化
Unit:空值,类似 Java 中 Void(大写)
AnyRef
Scala Collections
all java classes
other Scala classes
Null(空引用)
Nothing:什么都不知道
可以把抛出的返回值,返回给任何变量或函数
Byte Short Int Long
val b2: Byte = (10 + 20)
IDEA 的语法分析器会报错,实际编译不会报错
判断元素相等的方法。
函数式编程
函数高级
高阶函数
没有高阶函数,就要使用函数指针,比较复杂,Scala 提供了丰富的高阶函数用法,大大简化了函数的应用。
def addOperation(array: Array[Int], op: (Int, Int) => Int): = {
}
函数柯里化 & 闭包
函数闭包
将函数对象化,将其所用的局部变量打包放在堆区(C++ 和 Python 中也有类似特性),以供取用
递归
尾递归
控制抽象
把代码块作为参数传入
def myWhile(condition: =>Boolean): (=>Unit)=>Unit = {
def doloop(op: Unit): Unit = {
if (condition) {
op
myWhile(condition)(op)
}
}
doLoop _ //只有一个参数,可以用下划线代替
}
n = 10
myWhile(n >= 10) {
}
惰性加载(懒加载)
面向对象
Scala 包管理
封装
继承
多态
伴生对象
// 饿汉式
// 懒加载式