第1章-Scala-语言基础-(Spark精品课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第1章-Scala-语言基础-(Spark精品课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Scala 语言 基础 Spark 精品 课件
- 资源描述:
-
1、Scala Scala 语言基础语言基础汇报人:日期:目录目录2Scala基础3面向对象编程基础1Scala语言概述4函数式编程基础ScalaScala语语言概述言概述l Scala运行于Java虚拟机(JVM)之上,因此只要安装有相应的Java虚拟机,所有的操作系统都可以运行Scala程序,包括Window、Linux、Unix、 Mac OS等。lScala是一门类Java的多范式语言,它整合了面向对象编程和函数式编程的最佳特性。具体来讲:Scala运行于Java虚拟机(JVM)之上,并且兼容现有的Java程序Scala是一门纯粹的面向对象的语言Scala也是一门函数式语言 安装安装Sca
2、laScala登录Scala官网,下载scala-2.11.8.tgz把scala命令添加到path环境变量中启动Scala解释器:使用使用ScalaScala解释器解释器在Shell命令提示符界面中输入“scala”命令后,会进入scala命令行提示符状态:可以使用命令“:quit”退出Scala解释器,如下所示第一个第一个ScalaScala程序:程序:HelloWorldHelloWorld 注意,上面命令中一定要加入-classpath .,否则会出现“No such file or class on classpath: HelloWorld”目录目录2Scala基础3面向对象编程基
3、础1Scala语言概述4函数式编程基础ScalaScala声明和变量声明和变量Scala有两种类型的变量:val:是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值;var:是可变的,声明的时候需要进行初始化,初始化以后还可以再次对其赋值ScalaScala声明和变量声明和变量ScalaScala声明和变量声明和变量ScalaScala声明和变量声明和变量小技巧:如何在Scala解释器中输入多行代码基本数据类型和操作基本数据类型和操作Scala的数据类型包括:Byte、Char、Short、Int、Long、Float、Double和Boolean和Java不同的是,在Scala中
4、,这些类型都是“类”,并且都是包scala的成员,比如,Int的全名是scala.Int。对于字符串,Scala用java.lang.String类来表示字符串基本数据类型和操作基本数据类型和操作字面量(literal)基本数据类型和操作基本数据类型和操作操作符:在Scala中,可以使用加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等操作符,而且,这些操作符就是方法。例如,5 + 3和(5).+(3)是等价的,也就是说:等价于前者是后者的简写形式,这里的+是方法名,是Int类中的一个方法。和Java不同,在Scala中并没有提供+和-操作符,当需要递增和递减时,可以采用如下方式表达:
5、基本数据类型和操作基本数据类型和操作富包装类富包装类对于基本数据类型,除了以上提到的各种操作符外,Scala还提供了许多常用运算的方法,只是这些方法不是在基本类里面定义,还是被封装到一个对应的富包装类中。每个基本类型都有一个对应的富包装类,例如Int有一个RichInt类、String有一个RichString类,这些类位于包scala.runtime中。当对一个基本数据类型的对象调用其富包装类提供的方法,Scala会自动通过隐式转换将该对象转换为对应的富包装类型,然后再调用相应的方法。例如:3 max 5。RangeRange在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到
6、5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。(1)创建一个从1到5的数值序列,包含区间终点5,步长为1RangeRange(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1(3)创建一个从1到10的数值序列,包含区间终点10,步长为2(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.3f控制台输入输出语句控制台输入输出语句为了从控制台读写数据,可以使用以read为前缀的方法,包括:readInt、readDouble、readBy
7、te、readShort、readFloat、readLong、readChar readBoolean及readLine,分别对应9种基本数据类型,其中前8种方法没有参数,readLine可以不提供参数,也可以带一个字符串参数的提示。所有这些函数都属于对象scala.io.StdIn的方法,使用前必须导入,或者直接用全称进行调用控制台输入输出语句控制台输入输出语句控制台输入输出语句控制台输入输出语句为了向控制台输出信息,常用的两个函数是print()和println(),可以直接输出字符串或者其它数据类型控制台输入输出语句控制台输入输出语句Scala还带有C语言风格的格式化字符串的print
8、f()函数print()、println()和printf() 都在对象Predef中定义,该对象默认情况下被所有Scala程序引用,因此可以直接使用Predef对象提供的方法,而无需使用scala.Predef.的形式。读写文件读写文件写入文件写入文件Scala需要使用java.io.PrintWriter实现把数据写入到文件如果我们想把文件保存到一个指定的目录下,就需要给出文件路径读写文件读写文件读取文件读取文件可以使用Scala.io.Source的getLines方法实现对文件中所有行的读取异常处理异常处理Scala仍使用try-catch结构来捕获异常import java.io.F
9、ileReader import java.io.FileNotFoundException import java.io.IOException try val f = new FileReader(input.txt) / 文件操作 catch case ex: FileNotFoundException = / 文件不存在时的操作 case ex: IOException = / 发生I/O错误时的操作 finally file.close() / 确保关闭文件 Scala不支持Java中的“受检查异常”(checked exception),将所有异常都当作“不受检异常”(或称为运行时
10、异常)if if表达式表达式有一点与Java不同的是,Scala中的if表达式的值可以赋值给变量whilewhile循环循环forfor循环循环Scala中的for循环语句格式如下:其中,“变量-表达式”被称为“生成器(generator)”forfor循环循环不希望打印出所有的结果,过滤出一些满足制定条件的结果,需要使用到称为“守卫(guard)”的表达式比如,只输出1到5之中的所有偶数,可以采用以下语句:forfor循环循环Scala也支持“多个生成器”的情形,可以用分号把它们隔开,比如:forfor循环循环可以给每个生成器都添加一个“守卫”,如下:forfor循环循环Scala的for结
11、构可以在每次执行的时候创造一个值,然后将包含了所有产生值的集合作为for循环表达式的结果返回,集合的类型由生成器中的集合类型确定通过for循环遍历一个或多个集合,对集合中的元素进行“推导”,从而计算得到新的集合,用于后续的其他处理forfor (变量 Xiamen University, THU - Tsinghua University,PKU-Peking University)映射(映射(MapMap)如果要获取映射中的值,可以通过键来获取对于这种访问方式,如果给定的键不存在,则会抛出异常,为此,访问前可以先调用contains方法确定键是否存在映射(映射(MapMap)不可变映射,是无
12、法更新映射中的元素的,也无法增加新的元素。如果要更新映射的元素,就需要定义一个可变的映射也可以使用+=操作来添加新的元素映射(映射(MapMap)循环遍历映射循环遍历映射或者,也可以只遍历映射中的k或者v迭代器(迭代器(IteratorIterator)在Scala中,迭代器(Iterator)不是一个集合,但是,提供了访问集合的一种方法迭代器包含两个基本操作:next和hasNext。next可以返回迭代器的下一个元素,hasNext用于检测是否还有下一个元素迭代器(迭代器(IteratorIterator)scala val xs = List(1, 2, 3, 4, 5)xs: List
13、Int = List(1, 2, 3, 4, 5)scala val git = xs grouped 3git: IteratorListInt = non-empty iteratorscala git.next()res3: ListInt = List(1, 2, 3)scala git.next()res4: ListInt = List(4, 5)scala val sit = xs sliding 3sit: IteratorListInt = non-empty iteratorscala sit.next()res5: ListInt = List(1, 2, 3)scala
14、 sit.next()res6: ListInt = List(2, 3, 4)scala sit.next()res7: ListInt = List(3, 4, 5)Iterable有两个方法返回迭代器:grouped和sliding。然而,这些迭代器返回的不是单个元素,而是原容器(collection)元素的全部子序列。这些最大的子序列作为参数传给这些方法。grouped方法返回元素的增量分块,sliding方法生成一个滑动元素的窗口。两者之间的差异通过REPL的作用能够清楚看出。数组(数组(ArrayArray)数组是一种可变的、可索引的、元素具有相同类型的数据集合,它是各种高级语言中
15、最常用的数据结构。Scala提供了参数化类型的通用数组类ArrayT,其中T可以是任意的Scala类型,可以通过显式指定类型或者通过隐式推断来实例化一个数组。可以不给出数组类型,Scala会自动根据提供的初始化数据来推断出数组的类型数组(数组(ArrayArray)Array提供了函数ofDim来定义二维和三维数组,用法如下:valval myMatrix = Array.ofDimInt(3,4) /类型实际就是ArrayArrayIntvalval myCube = Array.ofDimString(3,2,4) /类型实际是ArrayArrayArrayInt可以使用多级圆括号来访问多
16、维数组的元素,例如myMatrix(0)(1)返回第一行第二列的元素数组(数组(ArrayArray)采用Array类型定义的数组属于定长数组,其数组长度在初始化后就不能改变。如果要定义变长数组,需要使用ArrayBuffer参数类型,其位于包scala.collection.mutable中。举例如下:import import scala.collection.mutable.ArrayBuffervalval aMutableArr = ArrayBuffer(10,20,30) aMutableArr += 40 aMutableArr.insert(2, 60,40) aMutabl
17、eArr -= 40 varvar temp=aMutableArr.remove(2) 元组元组元组是不同类型的值的聚集。元组和列表不同,列表中各个元素必须是相同类型,而元组可以包含不同类型的元素目录目录2Scala基础3面向对象编程基础1Scala语言概述4函数式编程基础简单的类简单的类最简单的类的定义形式是:可以使用new关键字来生成对象给类增加字段和方法给类增加字段和方法如果大括号里面只有一行语句,那么也可以直接去掉大括号,写成下面的形式:或者,还可以去掉返回值类型和等号,只保留大括号,如下:Unit后面的等号和大括号后面,包含了该方法要执行的具体操作语句创建对象创建对象下面我们新建对
18、象,并调用其中的方法:从上面代码可以看出,Scala在调用无参方法时,是可以省略方法名后面的圆括号的编译和执行编译和执行新建一个TestCounter.scala代码文件在Linux Shell命令提示符下,使用scala命令执行这个代码文件:上面命令执行后,会在屏幕输出“1”编译和执行编译和执行也可以进入到Scala解释器下面去执行TestCounter.scala 首先启动Scala解释器,如下:进入scala命令提示符状态以后,可以在里面输入如下命令:完成上面操作以后,可以退出Scala解释器,回到Linux系统的Shell命令提示符状态,退出Scala解释器的命令如下:编译和执行编译和
19、执行下面尝试一下,看看是否可以使用scalac命令对这个TestCounter.scala文件进行编译,如下:执行上述scalac命令后,会出现一堆错误,无法编译。为什么呢?原因:声明都没有被封装在对象中,因此,无法编译成JVM字节码编译和执行编译和执行在TestCounterJVM.scala中输入以下代码:使用scalac命令编译这个代码文件,并用scala命令执行,如下:上面命令执行后,会在屏幕输出“1”$ scalac TestCounterJVM.scala$ scala -classpath . MyCounter /MyCounter是包含main方法的对象名称,这里不能使用文件
20、名称TestCounterJVM编译和执行编译和执行现在我们对之前的类定义继续改进一下,让方法中带有参数。我们可以修改一下TestCounterJVM.scala文件:编译执行这个文件,就可以得到执行结果是5。gettergetter和和settersetter方法方法给类中的字段设置值以及读取值,在Java中是通过getter和setter方法实现的在Scala中,也提供了getter和setter方法的实现,但是并没有定义成getXxx和setXxx继续修改TestCounterJVM.scala文件:编译执行这个文件,就可以得到两行执行结果,第一行是0,第二行是4。gettergette
21、r和和settersetter方法方法但是,在Java中,是不提倡设置这种公有(public)字段的,一般都是把value字段设置为private,然后提供getter和setter方法来获取和设置字段的值。那么,到了Scala中该怎么做呢?现在我们去用scalac命令编译上面的代码,就会报错,会出现“error:variable value in class Counter cannot be accessed in Counter”这样的错误信息。因为,value字段前面用了修饰符private,已经成为私有字段,外部是无法访问的。我们先把value字段声明为private,看看会出现什么
22、效果,继续修改TestCounterJVM.scala文件:gettergetter和和settersetter方法方法value变成私有字段以后,Scala又没有提供getter和setter方法,怎么可以访问value字段呢?解决方案是,在Scala中,可以通过定义类似getter和setter的方法,分别叫做value和value_=,具体如下:编译执行这个文件,就可以得到三行执行结果,第一行是0,第二行是3,第三行是4。辅助构造器辅助构造器Scala构造器包含1个主构造器和若干个(0个或多个)辅助构造器辅助构造器的名称为this,每个辅助构造器都必须调用一个此前已经定义的辅助构造器或主
23、构造器下面定义一个带有辅助构造器的类,我们对上面的Counter类定义进行修改:(代码未完,剩余代码见下一页)辅助构造器辅助构造器(代码续上一页)编译执行上述代码后,得到右边结果:主构造器主构造器Scala的每个类都有主构造器。但是,Scala的主构造器和Java有着明显的不同,Scala的主构造器是整个类体,需要在类名称后面罗列出构造器所需的所有参数,这些参数被编译成字段,字段的值就是创建对象时传入的参数的值。对于上面给计数器设置name和mode的例子,刚才我们是使用辅助构造器来对name和mode的值进行设置,现在我们重新来一次,这次我们转而采用主构造器来设置name和mode的值。编译
24、执行上述代码后,得到结果:单例对象单例对象Scala并没有提供Java那样的静态方法或静态字段,但是,可以采用object关键字实现单例对象,具备和Java静态方法同样的功能。下面是单例对象的定义:可以看出,单例对象的定义和类的定义很相似,明显的区分是,用object关键字,而不是用class关键字。单例对象单例对象把上述代码放入到一个test.scala文件中测试在Shell命令提示符下输入scala命令运行上面代码:执行后,屏幕上会显示以下结果:2.3.2.2 2.3.2.2 伴生对象伴生对象在Java中,我们经常需要用到同时包含实例方法和静态方法的类,在Scala中可以通过伴生对象来实现
展开阅读全文