1 Scala概述
Scala这个名字代表可拓展语言。它能满足许多编程任务的要求。从脚本编写到大型系统的开发,它都能胜任。
Scala运行在标准的Java平台上。它支持所有的Java库。Scala可以很好的与Java组件配合使用。
Scala是一种混合类型的编程语言。它融合了面向对象编程以及函数式编程的概念。这种混合式编程用一种新的方式表达编程模式以及组件抽象。同时,它也早就了一种清晰、准确的编程风格。
2 Scala学习利器:Scala控制台
在下载并配置号Scala的环境变量之后便可以使用Scala控制台了。在Windows的命令行工具或是Mac、Linux的终端输入Scala命令便可打开Scala控制台。启动后,会有以下界面:
scala>
在控制台中输入任意表达式,控制台会执行并显示结果:
scala> 1 + 1
res0: Int = 2
可见scala控制台中显示的结果中,Int表示结果类型,等号后面的则是结果的值。res0是自动生成的变量名,因为输入的表达式的结果没有特定的变量名称。这个变量名可以在下次直接使用。例如在上面的基础上输入包含res0的表达式,则结果如下:
scala> res0 + 1
res1: Int = 3
需要退出时,输入命令:q
或者:quit
便可退出scala控制台。
学习scala,学会使用scala控制台是很重要的一步。
3 变量
Scala有两种变量:var和val。val变量在初始化之后不可以重新赋值,类似于Java中的final变量。而var变量是可以重新赋值的。变量定义如下:
var msg = "hello world!"
Scala的变量定义也可以确定类型,但与Java不同,其类型声明在变量名称之后:
val msg3: String = "Hello yet again, world!"
除了Scala的默认类型外,Scala也可以创建类的对象:
val big = new java.math.BigInteger("12345")
4 数组
数组的创建可以使用类的创建形式创建:
val greetStrings = new Array[String](3)
此时数组的每一个元素为空,需要对每一个元素进行赋值。在这里注意,在Scala中,数组的访问使用的是( )
而不是[ ]
。
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"
然而这样的方法并不提倡,数组的创建使用以下方法更好,以下方法创建了一个名为numNames
的字符串数组,包含字符串"zero"
、"one"
、"two"
:
val numNames = Array("zero", "one", "two")
5 函数
Scala的函数定义示例如下:
def max(x: Int, y: Int): Int = {
if(x > y)
x
else
y
}
在大部分情况下,编译器不要求定义函数的返回值类型。但在某些情况下,如函数为递归函数,编译器则要求函数的返回类型必须声明。
另外,如果函数的函数体只有一行内容,大括号也不需要。
综合以上两点,上述的max
函数则可以写成这样:
def max2(x: Int, y: Int) = if (x > y) x else y
与Java相同,函数可以不返回任何值。在scala中,这样的函数返回值为Unit
。它与Java的void
类型相似。
6 While循环
Scala的while循环与Java基本相似,以下为范例:
var i = 0;
while (i < args.length) {
if (i != 0) {
print(" ");
}
print(args(i));
i += 1;
}
println();
7 使用Foreach遍历数组
对于数组的遍历,可使用foreach进行。以下范例对字符串数组args中的每个字符串进行打印:
args.foreach((arg: String) => println(arg))
在语句中,arg
代表数组中的每个元素;=>
右边的内容表示要遍历的行为;String
代表元素的类型,但类型的说明是可选的,以下语句依然可以运行:
args.foreach((arg) => println(arg))
如果遍历的内容仅仅是一个单参数的函数,并且参数就是数组的元素,则foreach语句还可以仅仅写入遍历行为函数的名字:
args.foreach(println)
8 使用for循环遍历数组
与foreach遍历有点相似,但不同的是使用for进行遍历时并不是调用数组的成员函数的形式进行:
for (arg <- args)
println(arg)
在for后的圆括号中,左箭头左边的arg
是数组的元素代表,无需事先定义;右边的args
则是数组本身。注意arg
是一定val变量,因此无需在arg前添加val声明。另外在for循环中无法对arg重新赋值。
9 List
Scala的List类型与数组相似,它的创建如下:
val oneTwoThree = List[Int](1, 2, 3)
同样,Int的声明可以去掉:
val oneTwoThree = List(1, 2, 3)
Scala的List是无法更改的,即List里面的元素内容是无法改变的,类似于Java的String类型。若需要创建可以更改List则需要创建类java.util.List
的对象。
List是不可更改的,但是它可以与其他List的进行连接操作,创建一个新的List。使用符号:::
进行这个操作:
val oneTwo = List(1, 2)
val threeFour = List(3, 4)
val oneTwoThreeFour = oneTwo ::: threeFour
此时oneTwoThreeFour
的元素包括1、2、3、4。
除了连接别的数组,还可以连接新的元素,但使用的符号是::
:
val twoThree = List(2, 3)
val oneTwoThree = 1 :: twoThree
此时,oneTwoThree
包含元素1、2、3。注意,List必须放在最后。
在Scala定义了一个空的List,名字为Nil
。该List中没有任何元素。因此,可以使用Nil
与符号::
来创建List:
val oneTwoThree = 1 :: 2 :: 3 :: Nil
10 Tuple
Tuple是可存储任意类型以及数量的数据结构类型。其创建如下:
val pair = (99, "Luftballons")
括号中可以包含任意数量以及任意类型的数据。访问Tuple的数据使用点+下划线+数字进行访问:
println(pair._1)
println(pair._2)
注意,此时访问不再从0开始,而是从1开始。
如果需要明确Tuple类型,Scala提供最多22大小的Tuple类,其类的名字是Tuple+大小:
val t2: Tuple2[Int, String] = (99, "Luftballons")
val t6: Tuple6[Char, Char, String, Int, Int, String] = ('u', 'r', "the", 1, 4, "me")
11 Set
Set类型与Java中的Set类型相似,它是个没有顺序的数据集合。其创建如下:
val movieSet = Set("Hitch", "Poltergeist")
使用操作符+
或者+=
可以向Set中添加元素,以下两句效果相同:
movieSet = movieSet + "Alan"
movieSet += "Shrek"
此时movieSet
中包含Hitch、Poltergeist、Shrek、Alan。
注意,Set默认是不可变的,即Set的+
操作是将元素添加进Set后生成一个新的Set且被操作的Set原值是不改变的:
var movieSet0 = movieSet + "Mercer"
上例中,movieSet0
包含Mercer而movieSet
不包含。
如果需要使用可变的Set,可以在代码中中包含类scala.collection.mutable.Set
。此时使用的Set就是可变的了:
import scala.collection.mutable.Set
Set还有许多操作,详情见Scala文档。
12 Map
Map也是类似于Set的无顺序的集合类,但它存储的是一个Key-Value数据对。Map可以通过Key访问数据。
Map的创建如下:
val treasureMap = Map[Int, String]()
Map也可以使用+
以及+=
添加数据,但需要用->
来表示数据对,->
左边是key,右边是value:
treasureMap += (1 -> "Go to island.")
treasureMap += (2 -> "Find big X on ground.")
treasureMap += (3 -> "Dig.")
Map使用()
来访问数据,通过在括号中填入key来访问数据:
println(treasureMap(2))
上例则显示Find big X on ground
。
Map的其他操作同样见Scala文档。