大数据技术原理与应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第八章:Scala语言基础8Scala语言概述1计算机的缘起2编程范式3Scala简介8.1.1计算机的缘起•数学家阿隆佐•邱奇(AlonzoChurch)设计了“λ演算”,这是一套用于研究函数定义、函数应用和递归的形式系统•λ演算被视为最小的通用程序设计语言•λ演算的通用性就体现在,任何一个可计算函数都能用这种形式来表达和求值•λ演算是一个数理逻辑形式系统,强调的是变换规则的运用,而非实现它们的具体机器8.1.1计算机的缘起:图灵机模型•由一个控制器,一条有限长携带有信息和运算指令带子的带子和一个可在带子上左右移动的读写头组成•所有的电子计算机,都没有超出此模型•理想的计算机:毫无停顿的运行下去–关键问题:数据怎么准备好?依次执行(顺序)默认的执行顺序跳跃下行(分支)函数调用跳跃上行(循环)8.1.1计算机的缘起•英国数学家阿兰·图灵采用了完全不同的设计思路,提出了一种全新的抽象计算模型——图灵机•图灵机是现代计算机的鼻祖。现有理论已经证明,λ演算和图灵机的计算能力是等价的8.1.1计算机的缘起•冯·诺依曼(JohnVonNeumann)将图灵的理论物化成为实际的物理实体,成为了计算机体系结构的奠基者•1945年6月,冯·诺依曼提出了在数字计算机内部的存储器中存放程序的概念,这是所有现代计算机的范式,被称为“冯·诺依曼结构”8.1.2编程范式•编程范式是指计算机编程的基本风格或典范模式。常见的编程范式主要包括命令式编程和函数式编程。面向对象编程就属于命令式编程,比如C++、Java等•命令式语言是植根于冯·诺依曼体系的,一个命令式程序就是一个冯·诺依曼机的指令序列,给机器提供一条又一条的命令序列让其原封不动地执行•函数式编程,又称泛函编程,它将计算机的计算视为数学上的函数计算•函数编程语言最重要的基础是λ演算,λ演算对函数式编程特别是Lisp语言有着巨大的影响。典型的函数式语言包括Haskell、Erlang和Lisp等8.1.2编程范式•一个很自然的问题是,既然已经有了命令式编程,为什么还需要函数式编程呢?•为什么在C++、Java等命令式编程流行了很多年以后,近些年函数式编程会迅速升温呢?•命令式编程涉及多线程之间的状态共享,需要锁机制实现并发控制•函数式编程不会在多个线程之间共享状态,不需要用锁机制,可以更好并行处理,充分利用多核CPU并行处理能力8.1.3Scala简介Scala是一门类Java的多范式语言,它整合了面向对象编程和函数式编程的最佳特性。具体来讲:•Scala运行于Java虚拟机(JVM)之上,并且兼容现有的Java程序•Scala是一门纯粹的面向对象的语言•Scala也是一门函数式语言8.2Scala简介Scala是一门现代的门类Java的多范式编程语言,运行于Java平台(JVM,Java虚拟机),并兼容现有的Java程序,整合了面向对象编程和函数式编程的最佳特性。Scala的特性:•Scala具备强大的并发性,支持函数式编程,可以更好地支持分布式系统•Scala语法简洁,能提供优雅的APIScala兼容Java,运行速度快,且能融合到Hadoop生态圈中Scala是Spark的主要编程语言,但Spark还支持Java、Python、R作为编程语言Scala的优势是提供了REPL(Read-Eval-PrintLoop,交互式解释器),提高程序开发效率8.1.4Scala的安装和使用方法•Scala运行于Java虚拟机(JVM)之上,因此只要安装有相应的Java虚拟机,所有的操作系统都可以运行Scala程序,包括Window、Linux、Unix、MacOS等。•8.1.4.1安装Java•8.1.4.2安装Scala•8.1.4.3使用Scala解释器•8.1.4.4第1个Scala程序:HelloWorld8.1.4.1安装Java直接通过命令安装OpenJDK7配置JAVA_HOME环境变量使配置立即生效:8.1.4.2安装Scala登录Scala官网,下载scala-8.11.8.tgz把scala命令添加到path环境变量中启动Scala解释器:8.1.4.3使用Scala解释器在Shell命令提示符界面中输入“scala”命令后,会进入scala命令行提示符状态:可以使用命令“:quit”退出Scala解释器,如下所示:8.1.4.4第1个Scala程序:HelloWorld注意,上面命令中一定要加入-classpath.,否则会出现“Nosuchfileorclassonclasspath:HelloWorld”8.2Scala基础8.2.1基本语法8.2.2控制结构8.2.3数据结构8.8.4面向对象编程基础8.2.5函数式编程基础8.2.1基本语法8.2.1.1声明值和变量8.2.1.2基本数据类型和操作8.2.1.3Range8.2.1.4控制台输入输出语句8.2.1.5读写文件8.2.1.6异常处理8.2.1.1声明值和变量Scala有两种类型的变量:•val:是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值;•var:是可变的,声明的时候需要进行初始化,初始化以后还可以再次对其赋值。8.2.1.1声明值和变量8.2.1.1声明值和变量8.2.1.1声明值和变量小技巧:如何在Scala解释器中输入多行代码8.2.1.2基本数据类型和操作•Scala的数据类型包括:Byte、Char、Short、Int、Long、Float、Double和Boolean•和Java不同的是,在Scala中,这些类型都是“类”,并且都是包scala的成员,比如,Int的全名是scala.Int。对于字符串,Scala用java.lang.String类来表示字符串8.2.1.2基本数据类型和操作字面量(literal)8.2.1.2基本数据类型和操作操作符:在Scala中,可以使用加(+)、减(-)、乘(*)、除(/)、余数(%)等操作符,而且,这些操作符就是方法。例如,5+3和(5).+(3)是等价的,也就是说:等价于前者是后者的简写形式,这里的+是方法名,是Int类中的一个方法。和Java不同,在Scala中并没有提供++和--操作符,当需要递增和递减时,可以采用如下方式表达:8.2.1.2基本数据类型和操作富包装类•对于基本数据类型,除了以上提到的各种操作符外,Scala还提供了许多常用运算的方法,只是这些方法不是在基本类里面定义,还是被封装到一个对应的富包装类中•每个基本类型都有一个对应的富包装类,例如Int有一个RichInt类、String有一个RichString类,这些类位于包scala.runtime中•当对一个基本数据类型的对象调用其富包装类提供的方法,Scala会自动通过隐式转换将该对象转换为对应的富包装类型,然后再调用相应的方法。例如:3max58.2.1.3Range•在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现•Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等(1)创建一个从1到5的数值序列,包含区间终点5,步长为18.2.1.3Range(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1(3)创建一个从1到10的数值序列,包含区间终点10,步长为2(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.8f8.2.1.4控制台输入输出语句•为了从控制台读写数据,可以使用以read为前缀的方法,包括:readInt、readDouble、readByte、readShort、readFloat、readLong、readCharreadBoolean及readLine,分别对应9种基本数据类型,其中前8种方法没有参数,readLine可以不提供参数,也可以带一个字符串参数的提示•所有这些函数都属于对象scala.io.StdIn的方法,使用前必须导入,或者直接用全称进行调用8.2.1.4控制台输入输出语句8.2.1.4控制台输入输出语句为了向控制台输出信息,常用的两个函数是print()和println(),可以直接输出字符串或者其它数据类型8.2.1.4控制台输入输出语句Scala还带有C语言风格的格式化字符串的printf()函数print()、println()和printf()都在对象Predef中定义,该对象默认情况下被所有Scala程序引用,因此可以直接使用Predef对象提供的方法,而无需使用scala.Predef.的形式。8.2.1.5读写文件写入文件Scala需要使用java.io.PrintWriter实现把数据写入到文件如果我们想把文件保存到一个指定的目录下,就需要给出文件路径8.2.1.5读写文件读取文件可以使用Scala.io.Source的getLines方法实现对文件中所有行的读取8.2.1.6异常处理Scala仍使用try-catch结构来捕获异常importjava.io.FileReaderimportjava.io.FileNotFoundExceptionimportjava.io.IOExceptiontry{valf=newFileReader(input.txt)//文件操作}catch{caseex:FileNotFoundException=//文件不存在时的操作caseex:IOException=//发生I/O错误时的操作}finally{file.close()//确保关闭文件}Scala不支持Java中的“受检查异常”(checkedexception),将所有异常都当作“不受检异常”(或称为运行时异常)8.2.2控制结构8.2.2.1if条件表达式8.2.2.2while循环8.2.2.3for循环8.2.2.1if条件表达式有一点与Java不同的是,Scala中的if表达式的值可以赋值给变量8.2.2.2while循环8.2.2.3for循环Scala中的for循环语句格式如下:其中,“变量-表达式”被称为“生成器(generator)”8.2.2.3for循环•不希望打印出所有的结果,过滤出一些满足制定条件的结果,需要使用到称为“守卫(guard)”的表达式•比如,只输出1到5之中的所有偶数,可以采用以下语句:8.2.2.3for循环Scala也支持“多个生成器”的情形,可以用分号把它们隔开,比如:8.2.2.3for循环可以给每个生成器都添加一个“守卫”,如下:8.2.2.3for循环•Scala的for结构可以在每次执行的时候创造一个值,然后将包含了所有产生值的集合作为for循环表达式的结果返回,集合的类型由生成器中的集合类型确定•通过for循环遍历一个或多个集合,对集合中的元素进行“推导”,从而计算得到新的集合,用于后续的其他处理for(变量-表达式)yield{语句块}for推导式8.2.3数据结构8.2.3.1容器(Collection)8.2.3.2列表(List)8.2.3.3集合(Set)8.2.3.4映射(Map)8.2.3.5迭代器(Iterator)8.2.3.6数组(Array)8.2.3.7元组(Tuple)8.2.3.1容器(collection)•Scala提供了一套丰富的容器(collection)库,包括列表(List)、数组(Array)、集合(Set)、映射(Map)等•根据容器中元素的组织方式和操作方式,可以区分为有序和无序、可变和不可变等不同的容器类别•Scala用了三个包来组织容器类,分别是scala.collection、scala.collection.mutable和scala.collection.immutable8.2.3.1容器(collection)下图显示了scala.collection包中所有的容器类。这些都是高级抽象类或特质。例

1 / 139
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功