定义变量 val和var
val 和 var。val 等同于 Java 中的 final 变量,一旦被初始化,就不能再被重新赋值了。相反地,var 是非 final 变量,可以重复被赋值。
变量类型
可以显式标注,也可以不标注。
变量后面可以跟“冒号 + 类型”,以显式标注变量的类型。
var a:Long = 1L
var b = 2L
定义函数def
// 结尾的“Int =”组合表示 max 函数返回一个整数。
def max(x: Int, y: Int): Int = {
if (x > y) x
else y
}
函数返回值
在 Scala 中,函数体具体代码块最后一行的值将被作为函数结果返回。
在这个例子中,if 分支代码块的最后一行是 x,因此,此路分支返回 x。同理,else 分支返回 y。
:具体类型
例如: Int 表示返回是整数
:Unit 无返回
:Unit 类似Java的void关键字,无返回
入参默认值
// 这里参数suffix的默认值是"",即空字符串
// 函数结尾处的Unit类似于Java中的void关键字,表示该函数不返回任何结果
def deleteIndicesIfExist( baseFile: File, suffix: String = ""): Unit = {
info(s"Deleting index files with suffix $suffix for baseFile $baseFile")
val offset = offsetFromFile(baseFile)
Files.deleteIfExists(Log.offsetIndexFile(dir, offset, suffix).toPath)
Files.deleteIfExists(Log.timeIndexFile(dir, offset, suffix).toPath)
Files.deleteIfExists(Log.transactionIndexFile(dir, offset, suffix).toPath)
}
//下面这2种方式调用都是允许的
deleteIndicesIfExist(baseFile) // OK
deleteIndicesIfExist(baseFile, ".swap") // OK
元组Tuple
元组是承载数据的容器,一旦被创建,就不能再被更改了。
val a = (1, 2.3, "hello", List(1,2,3))
控制语句
循环
常见的循环有两种写法:命令式编程方式和函数式编程方式
val list = List(1, 2, 3, 4, 5)
for (element <- list) println(element)
list.foreach(e => println(e))
list.foreach(println)
case类
普通类类似,Case 类非常适合用来表示不可变数据。同时,它最有用的一个特点是,case 类自动地为所有类字段定义 Getter 方法,这样能省去很多样本代码。
使用Java定义一个平面上的点:
public final class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
// setter methods......
// getter methods......
}
使用Scala:
case class Point(x:Int, y: Int) // 默认写法。不能修改x和y
case class Point(var x: Int, var y: Int) // 支持修改x和y
这是在极客时间打卡的2月第2天;