Spark-Scala基础期末总结(书第二章)

目录

了解Scala语言

了解Scala特性

一、安装Scala

1.在Windows系统上安装Scala

2.运行Scala

二、定义函数识别号码类型

1.了解数据类型

1.1Scala常用数据类型

1.2 常量和变量

1.3使用运算符

1.4 定义与使用数组

1.5数组常用的方法

1.6 数组的使用

2.定义与使用函数

2.1 匿名函数

2.2 高阶函数---函数作为参考

2.3高阶函数---函数作为返回值

2.4 函数柯里化

 三、方法

1.使用if判断

2.使用for循环

3.定义与使用列表

3.1列表常用操作方法

3.2 Scala查看列表元素的方法

3.3合并两个列表使用的方法

4.定义与使用集合

4.1集合操作常用方法

5.定义与使用映射

6.定义与使用元组

7.用函数组合器

 8.定义与使用Scala类

8.1 使用Scala单例模式

9.读写文件


了解Scala语言

  • Scala是Scalable Language的缩写,是一种多范式的编程语言,由洛桑联邦理工学院的马丁·奥德斯在2001年基于Funnel的工作开始设计,设计初衷是想集成面向对象编程和函数式编程的各种特性。Scala 是一种纯粹的面向对象的语言,每个值都是对象。Scala也是一种函数式语言,因此函数可以当成值使用。由于Scala整合了面向对象编程和函数式编程的特性,因此Scala相对于Java、C#、C++等其他语言更加简洁

Scala源代码会被编译成Java字节码,因此Scala可以运行于Java虚拟机(Java Virtual Machine,JVM)之上,并可以调用现有的Java类库。

了解Scala特性

  1. 面向对象。
  2. 函数式编程。
  3. 静态类型。
  4. 可扩展。

一、安装Scala

1.在Windows系统上安装Scala

①从Scala官网下载Scala安装包,安装包名称为“scala.msi”。

②双击scala.msi安装包,开始安装软件。

③进入欢迎界面,单击右下角的“Next”按钮后出现许可协议选择提示框,选择接受许可协议中的条款并单击右下角的“Next”按钮。

④选择安装路径,本文Scala的安装路径选择在非系统盘的“D:\Program Files (x86)\spark\scala\” ,单击“OK”按钮进入安装界面。如下图所示:

⑤在安装界面中单击右下角的“Install”按钮进行安装,安装完成时单击“Finish”按钮完成安装。

⑥右键单击“此电脑”图标,选择“属性”选项,在弹出的窗口中选择“高级系统设置”选项。在弹出的对话框中选择“高级”选项卡,并单击“环境变量”按钮,在环境变量对话框中,选择“Path”变量并单击“编辑”按钮,在Path变量中添加Scala安装目录的bin文件夹所在路径,如“D:\Program Files (x86)\spark\scala\bin”。

2.运行Scala

1.Scala解释器也称为REPL(Read-Evaluate-Print-Loop,读取-执行-输出-循环)。

2.在命令行中输入“scala”,即可进入REPL,如下图:

3.REPL是一个交互式界面,用户输入命令时,可立即产生交互反馈。

4.输入“:quit”命令即可退出REPL,如下图:

5.右图是一个Scala类,该类实现了两个数相加的方法。

6.如果要使用该方法,那么需要通过import加载该方法,如左图,其中,add是类名,addInt是方法名。

二、定义函数识别号码类型

1.了解数据类型

1.1Scala常用数据类型

  • Scala会区分不同类型的值,并且会基于使用值的方式确定最终结果的数据类型,这称为类型推断。
  • Scala使用类型推断可以确定混合使用数据类型时最终结果的数据类型。
  • 如在加法中混用Int和Double类型时,Scala将确定最终结果为Double类型,如下图:

1.2 常量和变量

  • 常量。在程序运行过程中值不会发生变化的量为常量或值,常量通过val关键字定义,常量一旦定义就不可更改,即不能对常量进行重新计算或重新赋值。定义一个常量的语法格式如下:val name: type = initialization
  • 变量。变量是在程序运行过程中值可能发生改变的量。变量使用关键字var定义。与常量不同的是,变量定义之后可以重新被赋值。定义一个变量的语法格式如下。 var name: type = initialization

1.3使用运算符

 

1.4 定义与使用数组

  •  数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。
  • Scala定义一个数组的语法格式如下:
  • 第1种方式 var arr: Array[String] = new Array[String](num)
  • 第2种方式 var arr:Array[String] = Array(元素1,元素2,…)

1.5数组常用的方法

1.6 数组的使用

  • Scala可以使用range()方法创建区间数组。
  •  使用range()方法前同样需要先通过命令“import Array._”导入包。

2.定义与使用函数

  • 函数是Scala的重要组成部分,Scala作为支持函数式编程的语言,可以将函数作为对象。
  • 定义函数的语法格式如下:def functionName(参数列表): [return type] = {}
  • Scala提供了多种不同的函数调用方式,以下是调用函数的标准格式。functionName(参数列表)
  • 如果函数定义在一个类中,那么可以通过“类名.方法名(参数列表)”的方式调用。

2.1 匿名函数

  • 匿名函数即在定义函数时不给出函数名的函数。
  • Scala中匿名函数是使用箭头“=>”定义的,箭头的左边是参数列表,箭头的右边是表达式,表达式将产生函数的结果。
  • 通常可以将匿名函数赋值给一个常量或变量,再通过常量名或变量名调用该函数。
  • 若函数中的每个参数在函数中最多只出现一次,则可以使用占位符“_”代替参数。

2.2 高阶函数---函数作为参考

  • 高阶函数指的是操作其他函数的函数。
  • 高阶函数可以将函数作为参数,也可以将函数作为返回值。
  • 高阶函数经常将只需要执行一次的函数定义为匿名函数并作为参数。一般情况下,匿名函数的定义是“参数列表=>表达式”。
  • 由于匿名参数具有参数推断的特性,即推断参数的数据类型,或根据表达式的计算结果推断返回结果的数据类型,因此定义高阶函数并使用匿名函数作为参数时,可以简化匿名函数的写法。

2.3高阶函数---函数作为返回值

  • 高阶函数可以产生新的函数,并将新的函数作为返回值。
  • 定义高阶函数计算矩形的周长,该函数传入一个Double类型的值作为参数,返回以一个Double类型的值作为参数的函数,如下图:

2.4 函数柯里化

  • 函数柯里化是指将接收多个参数的函数变换成接收单一参数(最初函数的第一个参数)的函数,新的函数返回一个以原函数余下的参数为参数的函数。
  • 定义两个整数相加的函数,一般函数的写法及其调用方式如下图:

  • 使用函数柯里化

 

 三、方法

1.使用if判断

  • 在实际业务中,经常需要对数据进行过滤处理,使用if判断即可满足这个需求。
  • Scala中的if判断根据复杂程度可分为if语句、if…else语句、if…else if…else语句、if…else嵌套语句,语法格式如下:

# if语句

if(布尔表达式) { 若布尔表达式为true,则执行该语句块}

# if…else语句

if(布尔表达式) { 若布尔表达式为true,则执行该语句块}

else { 若布尔表达式为false,则执行该语句块}

# if…else if…else语句

if(布尔表达式1) {    

若布尔表达式1为true,则执行该语句块

} else if(布尔表达式2) {      

若布尔表达式2为true,则执行该语句块

} else if(布尔表达式3) {

   若布尔表达式3为true,则执行该语句块

}else {

  若以上布尔表达式都为false,则执行该语句块

# if…else嵌套语句

if (布尔表达式1) {

   if(布尔表达式2) {      若布尔表达式2为true,则执行该语句块

    } else if(布尔表达式3) {      若布尔表达式3为true,则执行该语句块

   } else {      若布尔表达式2为false且布尔表达式3为false,则执行该语句块    

   }

} else {    若以上条件都为false,则执行该语句块

}

2.使用for循环

  • 循环是指在某种条件下将一段代码按顺序重复执行。在Scala中有3种循环结构,分别为while循环、do…while循环和for循环。
  • for循环是相对较为常用的一种循环,for循环语法格式如下:

for(变量<- 集合) {循环语句}

  • 多重循环是常见的for循环,多重循环也称为for循环嵌套,是指在两个或多个区间内循环反复,多个循环区间用分号隔开.
  • Scala可以在for循环中使用if判断过滤一些元素,多个过滤条件用分号隔开。。
  • for循环使用yield可以将返回值作为一个变量存储,语法格式如下:

var retVar = for(var x <- List; if condition1; if condition2…) yield x

  • retVar是变量名,for关键字后的括号用于指明变量和条件,而yield会将每一次循环得到的返回值保存在一个集合中,循环结束后将返回该集合,并赋值给变量retVar。
  • 使用yield对1~10的偶数进行记录,并保存至变量even中,如下图:

3.定义与使用列表

  • Scala的列表(List)与数组非常相似,列表的所有元素都具有相同的类型。
  • 与数组不同的是,列表是不可变的,即列表的元素不能通过赋值进行更改。
  • 定义列表时,需要写明列表元素的数据类型,或者根据列表初值类型自动推断。具有类型T的元素的列表类型可写为List[T]。
  • 构造列表的两个基本单位是“Nil”和“::”。

①“Nil”可以表示空列表;

②“::”称为中缀操作符,表示列表从前端扩展,遵循右结合。

3.1列表常用操作方法

3.2 Scala查看列表元素的方法

  • head:查看列表的第一个元素。
  • tail:查看第一个元素之后的其余元素。
  • last:查看列表的最后一个元素。
  • Init:查看除最后一个元素外的所有元素。
  • take():查看列表前n个元素。

3.3合并两个列表使用的方法

  • 如果需要合并两个列表,那么可以使用:::()。
  • 但需要注意,“列表1:::列表2”与“列表1.:::(列表2)”的结果是不一样的,对于前者,列表2的元素添加在列表1的后面;对于后者,列表2的元素添加在列表1的前面。
  • 合并两个列表还可以使用concat()方法。
  • 用户可以使用contains()方法判断列表中是否包含某个元素,若列表中存在指定的元素则返回true,否则返回false。

4.定义与使用集合

Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。

4.1集合操作常用方法

Scala合并两个列表时使用的是:::()或concat()方法,而合并两个集合使用的是++()方法。

5.定义与使用映射

  • 映射(Map)是一种可迭代的键值对结构。
  • 所有的值都可以通过键来获取,并且映射中的键都是唯一的。
  • 集合操作常用方法同样也适合映射。
  • 另外映射还可以通过keys方法获取所有的键,通过values方法获取所有值,也可以通过isEmpty方法判断映射的数据是否为空。

6.定义与使用元组

  • 元组(Tuple)是一种类似于列表的结构,但与列表不同的是,元组可以包含不同类型的元素。
  • 元组的值是通过将单个的值包含在圆括号中构成的。
  • 目前,Scala支持的元组最大长度为22,即Scala元组最多只能包含22个元素。
  • 访问元组元素可以通过“元组名称._元素索引”进行,索引从1开始。

7.用函数组合器

  • map()方法可通过一个函数重新计算列表中的所有元素,并且返回一个包含相同数目元素的新列表。

  • foreach()方法和map()方法类似,但是foreach()方法没有返回值,只用于对参数的结果进行输出。

  • filter()方法可以移除传入函数的返回值为false的元素。

  • flatten()方法可以将嵌套的结构展开,即flatten()方法可以将一个二维的列表展开成一个一维的列表。

  • flatMap()方法结合了map()方法和flatten()方法的功能,接收一个可以处理嵌套列表的函数,再对返回结果进行连接。

  • groupBy()方法可对集合中的元素进行分组操作,返回的结果是一个映射。

 8.定义与使用Scala类

  • Scala是一种纯粹的面向对象语言,面向对象语言有两个重要的概念:类和对象。
  • 其中,类是对象的抽象,也可以把类理解为模板,对象才是真正的实体。
  • 一般定义类的格式如下:

class ClassName(参数列表) extendst {}

  • 一个Scala源文件中可以有多个类,并且Scala类可以有参数。
  • 一般,Scala类名的第一个字母需要大写,如果需要使用几个单词构成一个类的名称,那么每个单词的第一个字母都要大写。
  • 与Java等其他语言不同的是,Scala中的类不定义为public。
  • Scala类继承一个类时需要使用关键字extends。
  • Scala只允许继承一个父类,并且继承父类的所有属性和方法。
  • 子类继承父类中已经实现的方法时,需要使用override关键字,子类继承父类中未实现的方法时,可以不用override关键字。

8.1 使用Scala单例模式

  • Scala中没有static关键字,因此Scala的类中不存在静态成员。但是Scala可以使用object关键字实现单例模式。
  • Scala中使用单例模式时需要使用object定义一个单例对象(object对象),单例对象在整个程序中只有一个实例。单例对象与类的区别在于单例对象不能带参数。 定义单例对象的语法如下:

object ObjectName {}

  • 包含main方法的object对象可以作为程序的入口点。
  • 当单例对象与某个类共享同一个名称时,单例对象被称作这个类的伴生对象,类被称为这个单例对象的伴生类。类和它的伴生对象可以互相访问对方的私有成员。
  • 需要注意的是,必须在同一个源文件里定义类和它的伴生对象。

8.2 使用Scala模式匹配

  • Scala提供了强大的模式匹配机制。一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。模式和表达式之间用“=>”隔开。
  • 在Scala中,使用case关键字定义的类称为样例类。样例类是一种特殊的类,经过优化可应用于模式匹配。
  • Scala编译器为样例类添加了一些语法上的便捷设定,具体如下。

①在伴生对象中提供了apply()方法,因此不使用new关键字也可以构造对象。

②样例类参数列表中的所有参数已隐式获得val关键字。

③编译器为样例类添加了toString()、hashCode()和equals()等方法。

9.读写文件

  • 在实际的实践中,常常需要涉及文件的读写操作。
  • Scala不提供任何特殊文件写入能力,所以进行文件的写操作使用的是Java的I/O类中的PrintWriter来实现。
  • 有时候需要接收用户在屏幕上输入的指令来处理程序,这时可以使用StdIn.readLine接收用户输入的指令。用户可以在REPL中直接输入“StdIn.readLine”命令并按“Enter”键,并在屏幕上输入指令;也可以将StdIn.readLine赋值给一个变量,用户在屏幕上输入的内容即可赋值给该变量。

  • 用户可以使用Scala的Source类读取文件内容。

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值