了解Scala
- 是一门承载嵌入式DSL的优秀语言
- 具有强大而优雅的库,由于操作各类数据集合
- 具有强大类型系统,有助于在开发周期早期发现大量错误
- 具有强大的表达和传递函数的方法
变量和常量-val和var
var numberOfKittens = 6
val kittensPerHouse = 101
val alphabet = "abcdefghijklmnopqrstuvwxyz"
var done = false
numberOfKittens += 1
// kittensPerHouse = kittensPerHouse * 2 // This would not compile; kittensPerHouse is not updatable
println(alphabet)
done = true
- val关键字由于定义不可变的变量,var关键字用于定义可变变量
- 如果可以,尽量用val关键字定义变量,原因是通过减少变量重用避免犯错和代码难以阅读
- Scala语句结束不需要分号,分号一般在一行需要执行多条语句时使用
if语句
- Scala条件语句和其他语言在格式上无太大差异
- 不同的是,Scala的if语句会返回一个值,由最后进入的那个分支决定返回值
val likelyCharactersSet = if (alphabet.length == 26)
"english"
else
"not english"
println(likelyCharactersSet)
方法(函数)
- 在这里混用方法和函数的概念
- 使用def关键字定义函数
- 函数的过个参数之间使用逗号隔开
// Simple scaling function with an input argument, e.g., times2(3) returns 6
// Curly braces can be omitted for short one-line functions.
def times2(x: Int): Int = 2 * x
// More complicated function
def distance(x: Int, y: Int, returnPositive: Boolean): Int = {
val xy = x * y
if (returnPositive) xy.abs else -xy.abs
}
重载函数
多个函数可以使用相同的函数名,通过参数和参数类型进行区分
// Overloaded function
def times2(x: Int): Int = 2 * x
def times2(x: String): Int = 2 * x.toInt
times2(5)
times2("7")
递归和嵌套函数
在函数里可以定义函数,在特定范围内定义的函数只能在特定范围内使用
/** Prints a triangle made of "X"s
* This is another style of comment
*/
def asciiTriangle(rows: Int) {
// This is cute: multiplying "X" makes a string with many copies of "X"
def printRow(columns: Int): Unit = println("X" * columns)
if(rows > 0) {
printRow(rows)
asciiTriangle(rows - 1) // Here is the recursive call
}
}
// printRow(1) // This would not work, since we're calling printRow outside its scope
asciiTriangle(6)
List
Scala定义了多种序列,List很像Arrys,但比Arrys多出了附加和提取的操作
val x = 7
val y = 14
val list1 = List(1, 2, 3)
val list2 = x :: y :: y :: Nil // An alternate notation for assembling a list
val list3 = list1 ++ list2 // Appends the second list to the first list
val m = list2.length
val s = list2.size
val headOfList = list1.head // Gets the first element of the list
val restOfList = list1.tail // Get a new list with first element removed
val third = list1(2) // Gets the third element of a list (0-indexed)
循环语句
1.以下例子for是0~6,until是1~6,by 2是只有偶数
for (i <- 0 to 7) { print(i + " ") }
println()
for (i <- 0 until 7) { print(i + " ") }
println()
for(i <- 0 to 10 by 2) { print(i + " ") }
println()
2.for可以用来遍历集合或者序列中的每个元素
val randomList = List(util.Random.nextInt(), util.Random.nextInt(), util.Random.nextInt(), util.Random.nextInt())
var listSum = 0
for (value <- randomList) {
listSum += value
}
println("sum is " + listSum)