Scala编程基础.docx
- 文档编号:10155854
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:48
- 大小:2.87MB
Scala编程基础.docx
《Scala编程基础.docx》由会员分享,可在线阅读,更多相关《Scala编程基础.docx(48页珍藏版)》请在冰点文库上搜索。
Scala编程基础
Scala编程
1.课程目标2
1.1.目标1:
(初级)熟练使用scala编写Spark程序2
1.2.目标2:
(中级)动手编写一个简易Spark通信框架3
1.3.目标3:
(高级)为阅读Spark内核源码做准备4
2.Scala概述4
2.1.什么是Scala4
2.2.为什么要学Scala4
3.Scala编译器安装5
3.1.安装JDK5
3.2.安装Scala5
3.2.1.Windows安装Scala编译器5
3.2.2.Linux安装Scala编译器5
3.2.3.Scala开发工具安装6
4.Scala基础9
4.1.声明变量9
4.2.常用类型9
4.3.条件表达式9
4.4.块表达式10
4.5.循环11
4.6.调用方法和函数12
4.7.定义方法和函数12
4.7.1.定义方法12
4.7.2.定义函数13
4.7.3.方法和函数的区别13
4.7.4.将方法转换成函数(神奇的下划线)14
5.数组、映射、元组、集合14
5.1.数组14
5.1.1.定长数组和变长数组14
5.1.2.遍历数组16
5.1.3.数组转换17
5.1.4.数组常用算法17
5.2.映射18
5.2.1.构建映射18
5.2.2.获取和修改映射中的值18
5.3.元组19
5.3.1.创建元组19
5.3.2.获取元组中的值20
5.3.3.将对偶的集合转换成映射20
5.3.4.拉链操作20
5.4.集合21
5.4.1.序列21
5.5.Set22
5.6.Map23
6.类、对象、继承、特质24
6.1.类24
6.1.1.类的定义24
6.1.2.构造器24
6.2.对象26
6.2.1.单例对象26
6.2.2.伴生对象27
6.2.3.apply方法27
6.2.4.应用程序对象28
6.3.继承28
6.3.1.扩展类28
6.3.2.重写方法28
6.3.3.类型检查和转换29
6.3.4.超类的构造29
7.模式匹配和样例类30
7.1.匹配字符串30
7.2.匹配类型30
7.3.匹配数组、元组31
7.4.样例类32
7.5.Option类型32
7.6.偏函数33
1.课程目标
1.1.目标1:
(初级)熟练使用scala编写Spark程序
单词统计:
sc.textFile("hdfs:
//spark1:
9000/word.txt").flatMap(_.split("")).map(x=>(x,1)).reduceByKey(_+_).collect
单词统计排序:
sc.textFile("hdfs:
//spark1:
9000/word.txt").flatMap(_.split("")).map(x=>(x,1)).reduceByKey(_+_).sortBy(_._2,false).collect
结果保存起来:
sc.textFile("hdfs:
//spark1:
9000/word.txt").flatMap(_.split("")).map(x=>(x,1)).reduceByKey(_+_).saveAsTextFile("hdfs:
//spark1:
9000/usr/out")
1.2.目标2:
(中级)动手编写一个简易Spark通信框架
1.3.目标3:
(高级)为阅读Spark内核源码做准备
2.Scala概述
2.1.什么是Scala
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。
Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
2.2.为什么要学Scala
1.优雅:
这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
2.速度快:
Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。
3. 能融合到Hadoop生态圈:
Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。
JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
3.Scala编译器安装
3.1.安装JDK
因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK,目前我们最低版本要1.7以上,目前最近版本是1.8
3.2.安装Scala
3.2.1.Windows安装Scala编译器
访问Scala官网http:
//www.scala-lang.org/下载Scala编译器安装包,目前最新版本是2.12.x,但是目前大多数的框架都是用2.10.x-2.11.x编写开发的,所以这里推荐2.11.8版本,下载scala-2.11.8.msi后点击下一步就可以了
在path环境变量中,配置$SCALA_HOME/bin目录
在windows命令行输入scala
检查版本:
Scala–version
Scala
Valstr=“Helloscala”
3.2.2.Scala解析器的使用
REPL:
Read(取值)->Evaluation(求值)->Print(打印)->Loop(循环)。
scala解释器也被称为REPL,会快速编译scala代码为字节码,然后交给JVM来执行
·计算表达式:
在scala>命令行内,键入scala代码,解释器会直接返回结果给你。
如果你没有指定变量来存放这个值,那么值默认的名称为res,而且会显示结果的数据类型,比如Int、Double、String等等。
·例如,输入1+1,会看到res0:
Int=2
·内置变量:
在后面可以继续使用res这个变量,以及它存放的值。
·例如,2.0*res0,返回res1:
Double=4.0
·例如,"Hi,"+res0,返回res2:
String=Hi,2
·自动补全:
在scala>命令行内,可以使用Tab键进行自动补全。
·例如,输入res2.to,敲击Tab键,解释器会显示出以下选项,toCharArray,toLowerCase,toString,toUpperCase。
因为此时无法判定你需要补全的是哪一个,因此会提供给你所有的选项。
·例如,输入res2.toU,敲击Tab键,直接会给你补全为res2.toUpperCase。
3.2.3.Scala与Java的关系
Scala与Java的关系是非常紧密的!
!
因为Scala是基于Java虚拟机,也就是JVM的一门编程语言。
所有Scala的代码,都需要经过编译为字节码,然后交由Java虚拟机来运行。
所以Scala和Java是可以无缝互操作的。
Scala可以任意调用Java的代码。
所以Scala与Java的关系是非常非常紧密的。
3.2.4.声明变量
·声明val变量:
可以声明val变量来存放表达式的计算结果。
·例如,valresult=1+1
·后续这些常量是可以继续使用的,例如,2*result
·但是常量声明后,是无法改变它的值的,例如,result=1,会返回error:
reassignmenttoval的错误信息。
·声明var变量:
如果要声明值可以改变的引用,可以使用var变量。
·例如,valmyresult=1,myresult=2
·但是在scala程序中,通常建议使用val,也就是常量,因此比如类似于spark的大型复杂系统中,需要大量的网络传输数据,如果使用var,可能会担心值被错误的更改。
·在Java的大型复杂系统的设计和开发中,也使用了类似的特性,我们通常会将传递给其他模块/组件/服务的对象,设计成不可变类(ImmutableClass)。
在里面也会使用java的常量定义,比如final,阻止变量的值被改变。
从而提高系统的健壮性(robust,鲁棒性),和安全性。
·指定类型:
无论声明val变量,还是声明var变量,都可以手动指定其类型,如果不指定的话,scala会自动根据值,进行类型的推断。
·例如,valname:
String=null
·例如,valname:
Any="leo"
·声明多个变量:
可以将多个变量放在一起进行声明。
·例如,valname1,name2:
String=null
·例如,valnum1,num2=100
3.2.5.数据类型与操作符
·基本数据类型:
Byte、Char、Short、Int、Long、Float、Double、Boolean。
·乍一看与Java的基本数据类型的包装类型相同,但是scala没有基本数据类型与包装类型的概念,统一都是类。
scala自己会负责基本数据类型和引用类型的转换操作。
·使用以上类型,直接就可以调用大量的函数,例如,1.toString(),1.to(10)。
·类型的加强版类型:
scala使用很多加强类给数据类型增加了上百种增强的功能或函数。
·例如,String类通过StringOps类增强了大量的函数,"Hello".intersect("World")。
·例如,Scala还提供了RichInt、RichDouble、RichChar等类型,RichInt就提供了to函数,1.to(10),此处Int先隐式转换为RichInt,然后再调用其to函数
·基本操作符:
scala的算术操作符与java的算术操作符也没有什么区别,比如+、-、*、/、%等,以及&、|、^、>>、<<等。
·但是,在scala中,这些操作符其实是数据类型的函数,比如1+1,可以写做1.+
(1)
·例如,1.to(10),又可以写做1to10
·scala中没有提供++、--操作符,我们只能使用+和-,比如counter=1,counter++是错误的,必须写做counter+=1.
3.2.6.函数调用与apply()函数
·函数调用方式:
在scala中,函数调用也很简单。
·例如,importscala.math._,sqrt
(2),pow(2,4),min(3,Pi)。
·不同的一点是,如果调用函数时,不需要传递参数,则scala允许调用函数时省略括号的,例如,"HelloWorld".distinct
·apply函数
·Scala中的apply函数是非常特殊的一种函数,在Scala的object中,可以声明apply函数。
而使用“类名()”的形式,其实就是“类名.apply()”的一种缩写。
通常使用这种方式来构造类的对象,而不是使用“new类名()”的方式。
·例如,"HelloWorld"(6),因为在StringOps类中有defapply(n:
Int):
Char的函数定义,所以"HelloWorld"(6),实际上是"HelloWorld".apply(6)的缩写。
·例如,Array(1,2,3,4),实际上是用Arrayobject的apply()函数来创建Array类的实例,也就是一个数组。
3.2.7.编写一个scala文本类
1.新建一个HelloScala.scala
objectHelloScala{
defmain(args:
Array[String]){
println(“helloscala,Iloveyou”)
}
}
编译:
Scalachelloscala.scala
运行:
Scalahelloscala
3.2.8.命令行下执行Scala文件
//helloworld.scala
[plain] viewplain copy print?
1.object HelloWorld {
2. def main(args:
Array[String]) {
3. println("Hello, World!
")
4. }
5.}
执行命令为:
[plain] viewplain copy print?
1.F:
\scala_workspace\helloworld>scala helloworld.scala
2.Hello, World!
或者
先将文件编译为.class字节码,然后再执行
[plain] viewplain copy print?
1.F:
\scala_workspace\helloworld>scalac helloworld.scala
[plain] viewplain copy print?
1.F:
\scala_workspace\helloworld>scala -classpath . HelloWorld
2.Hello, World!
或scala-cp.HelloWorld
注意第二句一定要带上"-classpath.",否则会爆“Nosuchfileorclassonclasspath:
HelloWorld”。
由于scala将.scala文件编译为.class文件,众所周知,.class文件java也可以执行的
[plain] viewplain copy print?
1.F:
\scala_workspace\helloworld>java -classpath ".;D:
\Program Files\scala\lib\scala-library.jar" HelloWorld
2.Hello, World!
注意这里必须要要指定 -classpath".;D:
\ProgramFiles\scala\lib\scala-library.jar" 分号两侧的.和 D:
\ProgramFiles\scala\lib\scala-library.jar缺一不可!
3.2.9.Linux安装Scala编译器
下载Scala地址
tar-zxvfscala-2.10.6.tgz-C/usr/java
配置环境变量,将scala加入到PATH中
vi.basrc
exportJAVA_HOME=/usr/java/jdk1.7.0_45
exportPATH=$PATH:
$JAVA_HOME/bin:
/usr/local/scala/bin
3.2.10.Scala开发工具安装
目前Scala的开发工具主要有两种:
Eclipse和IDEA,这两个开发工具都有相应的Scala插件,如果使用Eclipse,直接到Scala官网下载即可http:
//scala-ide.org/download/sdk.html。
由于IDEA的Scala插件更优秀,大多数Scala程序员都选择IDEA,可以到
1.安装IDEA,点击下一步即可。
由于我们离线安装插件,所以点击SkipAllandSetDefaul
2.下载IEDA的scala插件,地址
3.安装Scala插件:
Configure->Plugins->Installpluginfromdisk->选择Scala插件->OK->重启IDEA
3.2.11.字体调整
3.2.12.添加自动补全
修改方法如下:
点击文件菜单(File)–>点击设置(Settings…Ctrl+Alt+S),–>打开设置对话框。
在左侧的导航框中点击KeyMap。
Alt+/
接着在右边的树型框中选择Mainmenu–>Code–>Completion.
接着需要做两件事:
1.移除原来的CycleExpandWord的Alt+斜杠快捷键绑定。
2.在Basic上点击右键,去除原来的Ctrl+空格绑定,然后添加Alt+斜杠快捷键。
然后应用(Apply),OK.
http:
//www.open-
4.Scala基础
4.1.声明变量
packagecom.zhang.scala.day1
/**
*Createdbyzhchzh1000on2016/10/5.
*/
objectVariableDemo{
defmain(args:
Array[String]){
//使用val定义的变量值是不可变的,相当于java里用final修饰的变量
vali=1
//使用var定义的变量是可变得,在Scala中鼓励使用val
vars="hello"
//Scala编译器会自动推断变量的类型,必要的时候可以指定类型
//变量名在前,类型在后
valstr:
String="18zhang"
}
}
4.2.常用类型
Scala和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型,这些都是类
4.3.条件表达式
Scala的的条件表达式比较简洁,例如:
packagecom.zhang.scala.day1
/**
*Createdbyzhchzh1000on2016/10/5.
*/
objectConditionDemo{
defmain(args:
Array[String]){
valx=1
//判断x的值,将结果赋给y
valy=if(x>0)1else-1
//打印y的值
println(y)
//支持混合类型表达式
valz=if(x>1)1else"error"
//打印z的值
println(z)
//如果缺失else,相当于if(x>2)1else()
valm=if(x>2)1
println(m)
//在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
valn=if(x>2)1else()
println(n)
//if和elseif
valk=if(x<0)0
elseif(x>=1)1else-1
println(k)
}
}
4.4.块表达式
packagecom.zhang.scala.day1
/**
*CreatedbyZXon2015/11/7.
*/
objectBlockExpressionDemo{
defmain(args:
Array[String]){
valx=0
//在scala中{}中课包含一系列表达式,块中最后一个表达式的值就是块的值
//下面就是一个块表达式
valresult={
if(x<0){
-1
}elseif(x>=1){
1
}else{
"error"
}
}
//result的值就是块表达式的结果
println(result)
}
}
4.5.循环
在scala中有for循环和while循环,用for循环比较多
for循环语法结构:
for(i<-表达式/数组/集合)
packagecom.zhang.scala.day1
objectForDemo{
defmain(args:
Array[String]){
//for(i<-表达式),表达式1to10返回一个Range(区间)
//每次循环将区间中的一个值赋给i
for(i<-1to10)
println(i)
//for(i<-数组)
valarr=Array("a","b","c")
for(i<-arr)
println(i)
//高级for循环
//每个生成器都可以带一个条件,注意:
if前面没有分号
for(i<-1to3;j<-1to3ifi!
=j)
print((10*i+j)+"")
println()
//for推导式:
如果for循环的循环体以yield开始,则该循环会构建出一个集合
//每次迭代生成集合中的一个值
valv=for(i<-1to10)yieldi*10
println(v)
1.to(10).map(_*10)
valal=Array(1,2,3,4,5,6,7,8,9)
vala2=for(i<-a1;if(i%2==0))yieldi
al.filter(_%2==0)
}
}
4.6.调用方法和函数
Scala中的+-*/%等操作符的作用与Java一样,位操作符&|^>><<也一样。
只是有
一点特别的:
这些操作符实际上是方法。
例如:
a+b
是如下方法调用的简写:
a.+(b)
a方法b可以写成a.方法(b)
案例:
1+21.+
(2)
4.7.定义方法和函数
4.7.1.在类里面定义方法
方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型
4.7.2.定义函数
4.7.3.方法和函数的区别
在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作
案例:
首先定义一个方法,再定义一个函数,然后将函数传递到方法里面
valfunc1=(x:
Int,y:
Double)=>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Scala 编程 基础