一、环境搭建
1、启动Scala解释器
(1)安装Scala;
(2)确保scala/bin目录位于系统PATH中;
(3)打开命令行窗口,键入scala并按Enter键。
2、IDE(based on Eclipse IDE)
(1)下载相应版本 IDE;
(2)解压。
在IDE中新建Scala Worksheet(跟REPL类似)。
二、基础
1、变量
(1)三种变量修饰符
val 定义immutable variable(常量);
var 定义 mutable variable(变量);
lazy val(只有当该变量首次被使用的时候才会取值) ;
可以不显示指定变量类型,因为Scala会自动进行类型推导。
2、Scala的类型体系
(1)常用类型:Byte、Char、Short、Int、Long、Float、Double和Boolean。
与Java不同的是,这些类型是类。Scala并不可以区分基本类型和引用类型。
在Scala中,我们用方法来做数值类型之间的转换,99.44.toInt得到99。
3、算术和操作符重载
操作符:+-/%和&|^>><<。注意:这些操作符实际上都是方法,且在Scala中不提供++,--操作符。
三、控制结构与函数
1、条件表达式
(1)if/else表达式;
如:val s=if(x>0)1 else -1
(2)?:表达式;
如:x>0?1:-1
说明:Scala中没有switch语句,不过它有强大的模式匹配机制。
注意:REPL在同一时间只能看到一行代码。如果想在REPL中粘帖成块代码,可使用粘贴模式,键入:paste。把代码块粘贴进去,然后按Ctrl+D。
2、循环
(1)while循环;
如:
while(n>0){ r=r*n n-=1 }
(2)for循环和for推导式
for(i <- 表达式)
如:
for(i<-1 to n)println(i) //i将遍历1to n中的所有值 for(i<-1 to 9;j <- 1 to 9)println(i*10+j) //多重迭代 for(i <-1 to 9 if i!=5;j <- 1 to 9 if i!=j)println(i*10+j) //守卫 for(i <-1 to 3;from =4-j;j <-from to 3) println(i*10+j) //变量 val r=for(i <- 1 to n)yield i*i //r为1,4,9,…… for((x,y) <- pairs)println(x+” ”+y) //使用提取器析构对偶和其他值
3、函数
如:
def abs(x:Double)=if(x>=0)x else –x
def fac(n:Int)={
val r=1
for(i <- 1 to n)r=r*i
r //块中最后一个表达式的值就是函数的返回值
}
def fac(n:Int):Int=if(n <=0)1 else n*fac(n-1) //递归函数,要指定返回类型
四、数组相关操作
1、定长数组Array 如:
val nums=new ArrayInt //10个整数的数组,初始化为0
val a=new ArrayString //10个元素的字符串数组,初始化为null
val matrix=Array.ofDimDouble //3行4列的二维数组
2、变长数组:数组缓冲ArrayBuffer 如:
import scala.collection.mutable.ArrayBuffer
val b=ArrayBuffer[Int]() //一个空的数组缓冲
b +=1 //用+=在尾端添加元素,ArrayBuffer(1)
b +=(1,2,3,5) //ArrayBuffer(1,1,2,3,5)
b ++=Array(8,13,21) //可用++=在尾端追加任何集合
b.trimEnd(5) //移除最后5个元素, ArrayBuffer(1,1,2)
b.insert(2,7,8,9) //在下标2前面插入7,8,9;ArrayBuffer(1,1,7,8,9,2)
b.remove(2) // 移除下标为2的元素,ArrayBuffer(1,1,8,9,2)
b.remove(2,3) //从下标为2的元素开始移除3个元素,ArrayBuffer(1,1)
3、数组遍历
(1)for(elem <- a)
println(elem) //其中a为数组名
(2)for(i <- 0 until a.length)
println(i+”:”+a[i])
注:0 until 10 //Range(0,1,2,3,4,5,6,7,8,9)
若想要每两个一跳,可让i这样遍历
0 until(a.length,2) //Range(0,2,4,.……)
若想要从数组的尾端开始,可让i这样遍历
0 until(a.length) .reverse //Range(.……,2,1,0)
五、映射
1、构造映射
val scores =Map(“Alice” ->10,”Bob” ->3,”Cindy” ->8)
//不可变Map[String,Int]
val scores=scala.collection.mutable.Map(“Alice” ->10,”Bob” ->3,”Cindy” ->8)
//可变Map[String,Int]
val scores=scala.collection.mutable.HashMap[String ,Int]
//空的Map[String,Int]
2、获取映射中的值
val bobScore=scores(“Bob”) //如果映射中不包含Bob键,则会抛出异常
改进后
val bobScore=if(scores.contains(“Bob”)) scores(“Bob”) else 0
该行代码的快捷写法如下:
val bobScore=scores.getOrElse(“Bob”,0)
3、更新映射中的值
假定scores是可变的,
scores(“Bob”)=10 //若Bob键存在,则更新Bob键对应的值;否则添加Bob键值对。
scores +=(“Bob” ->10,”Fred” ->7) //用+=添加多个关系
scores -=”Alice” //用-=移除某个键值对
4、迭代映射
for((k,v) <- 映射) 处理k和v
五、模式匹配
val x=r match{
case ‘0’ =>… //匹配值
case ch if someProperty(ch) => … //守卫
case e:Employee =>… //匹配运行期类型
case (x,y) =>… //使用提取器析构对偶和其他值
case Some(v) =>… //样例类具有提取器功能
case 0 ::tail =>… //提取器的中置表示法产出对偶
case _ => //缺省样例
}
try{ . . . }catch{
case _:MalformedURLException =>println(“Bad URL”)
case ex:IOException =>ex.printStackTrace()
}