手记

大数据入门之Scala学习——基础篇

Scala学习——基础篇

一、环境搭建
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()
}
12人推荐
随时随地看视频
慕课网APP