安装运行,函数定义,列表整合等内容讲解
树图思维导图提供 第二章 Scala基础 在线思维导图免费制作,点击“编辑”按钮,可对 第二章 Scala基础 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:f3bf6bf602d13252f1cf81511cebf88b
第二章 Scala基础思维导图模板大纲
了解 Scala 语言
Scala 是 Scalable Language 的缩写,是一种多范式的编程语言,由洛桑联邦理工学院的马丁·奥德斯在 2001年基于Funnel 的工作开始设计,设计初衷是想集成面向对象编程和函数式编程的各种特性。Scala是一种纯粹的面向对象的语言,每个值都是对象。Scala也是一种函数式语言,因此函数可以当成值使用。由于Scala 整合了面向对象编程和函数式编程的特性,因此 Scala相对于 Java、C#、C++等其他语言更加简洁。 Scala 源代码会被编译成 Java 字节码,因此 Scala 可以运行于 Java 虛拟机(Java VirtualMachine,JVM)之上,并可以调用现有的Java类库。
了解 Scala 特性
Scala 具有以下特性。 (1)面向对象 Scala 是一种纯粹的面向对象语言。一个对象的类型和行为是由类和特征描述的。类通过子类化和灵活的混合类进行扩展,成为多重继承的可靠解决方案。 (2)函数式编程 Scala 提供了轻量级语法来定义匿名函数,支持高阶函数,允许函数嵌套,并支持函数柯里化。Scala 的样例类与模式匹配支持函数式编程语言中的代数类型。Scala的单例对象提供了方便的方法来组合不属于类的函数。用户还可以使用 Scala 的模式匹配,编写类似正则表达式的代码处理可扩展标记语言(Extensible MarkupLanguage,XML)格式的数据。 (3)静态类型 Scala配备了表现型的系统,以静态的方式进行抽象,以安全和连贯的方式进行使用。系统支持将通用类、内部类、抽象类和复合类作为对象成员,也支持隐式参数、转换和多态方法等,这为抽象编程的安全重用和软件类型的安全扩展提供了强大的支持。 (4)可扩展 在实践中,专用领域的应用程序开发往往需要特定的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式无缝添加新的语言结构。
了解数据类型
任何一种计算机语言都有其数据类型,Scala也不例外。Scala 的数据类型与Java 数据类型相似,但不同于 Java,Scala 没有原生的数据类型。Scala的数据类型均为对象,因此通过数据类型可以调用方法。在 Scala中,所有数据类型的第一个字母都必须大写,Scala的数据类型有 Byte、Short、Int、Long、Float、Double、Char、String、Boolean、Unit、Null.Nothing、Any 和 AnyRef,常用数据类型。 Int 表示整数。Float与 Double 均表示浮点数,当浮点数有f或F后缀时表示 Float 类型:当浮点数没有后缀时,表示 Double 类型。String 表示字符串,使用双弓号包含一系列字符。Boolean 只表示两个特殊的值,true或false。Unit是 Scala 中比较特殊的一种数据类型,在 Java 中创建一个方法时经常使用 void 表示该方法无返回值,而在 Scala中没有 void 关键字,使用 Unit 表示无返回值,因此,Unit 等同于 Java 中的 void。Scala 会区分不同类型的值,并且会基于使用值的方式确定最终结果的数据类型,这称为类型推断。Scala 使用类型推断可以确定混合使用数据类型时最终结果的数据类型。如在加法中混用Int和 Double 类型时,Scala将确定最终结果为 Double 类型。
定义与使用常量、变量
在 Scala 中,使用 val 关键字定义一个常量,使用 var 关键字定义一个变量。 (1)常量:在程序运行过程中值不会发生变化的量为常量或值,常量通过 va1 关键字定义常量一旦定义就不可更改,即不能对常量进行重新计算或重新赋值。val 关键字后依次跟着的是常量名称、冒号“:”、数据类型、赋值运算符“_”和初始值。由于 Scala 具备类型推断的功能,因此定义常量时可以不用显式地说明数据类型。若需要显式地指明常量的数据类型,则可以在常量名后通过“:type”(type 指代某一种数据类型)说明类型。常量名要以字母或下划线开头,且变量名不能使用美元符号(S)一旦初始化一个常量,就不能再对其进行修改,若是强行改变常量的初始值,则Scala会提示“error; reassignmentto val!”的错误。如定义一个常量x,x的值为2、若对x重新赋值为 3,则代码会报错。 (2)变量:变量是在程序运行过程中值可能发生改变的量。变量使用关键字var定义。与常量不同的是,变量定义之后可以重新被赋值。变量的命名规则与常量类似,也可以不显式地说明值的数据类型。需要注意的是,变量在重新赋值时,只能将同类型的值赋值给变量。否则Scala会提示“error: type mismatch'的错误。
使用运算符
Scala 是一种面向对象的函数式编程语言,内置了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符等。Scala运算符的意义与用法和其他语言的一致,因为 Scala的运算符是函数的一种展现方式,所以 Scala 也可以通过“值,运算符(参数)”的方式使用运算符。
定义与使用数组
数组是 Scala 中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。定义一个不可变数组z,长度为3,并且为每个元素设置值,值为不同的搜索引擎名称。数组作为重要的数据结构,具备许多基本操作方法,数组常用的方法。
定义与使用函数
函数是 Scala 的重要组成部分,Seala 作为支持函数式编程的语言,可以将函数作为对象,定义函数的语法格式如下。函数的定义由一个 def关键字开始,紧接着是函数名称和可选的参数列表,其次是一个冒号“:”和函数的返回类型,之后是赋值运算符“_”,最后是方法体。其中,参数列表中需要指定参数名称和参数类型。函数的返回类型[return type]可以是任意合法的 Scala数据类型。若函数无返回值,则函数的返回类型为“Unit”例如,定义一个函数 add,实现两个数相加的功能,函数返回类型为nt,两个数相加的结果作为返回值。在Java中,函数需要使用retumn 关键字指明返回值,而 Scala 函数中可以不加 return 关键字指明返回值。
1、匿名函数:匿名函数即在定义函数时不给出函数名的函数。Scala 中匿名函数是使用箭头“=>”定义的,箭头的左边是参数列表,箭头的右边是表达式,表达式将产生函数的结果。定义两个整数相加的匿名函数。 通常可以将匿名函数赋值给一个常量或变量,再通过常量名或变量名调用该函数。若函数中的每个参数在函数中最多只出现一次,则可以使用占位符“”代替参数。例如,匿名函数也可以将参数替换成“”。
2.高阶函数--函数作为参数 高阶函数指的是操作其他函数的函数。高阶函数可以将函数作为参数,也可以将函数作为返回值。 高阶函数经常将只需要执行一次的函数定义为匿名函数并作为参数。一般情况下,匿名函数的定义是“参数列表=>表达式”。由于匿名参数具有参数推断的特性,即推断参数的数据类型、或根据表达式的计算结果推断返回结果的数据类型,因此定义高阶函数并使用匿名雨数作为参数时、可以简化匿名雨数的写法。如定义两个整数相加的高阶函数 addlnt函数 addlnt 中使用了一个匿名兩数f、值a和值b作为参数,而函数f又调用了a和b作为参数。
3、高阶函数--函数作为返回值 高阶函数可以产生新的函数,并将新的函数作为返回值。定义高阶函数计算矩形的周长,该函数传入一个 Double 类型的值作为参数,返回以一个 Double 类型的值作为参数的函数。
4.函数柯里化 函数柯里化是指将接收多个参数的函数变换成接收单一参数( 最初函数的第一个参数的函数,新的函数返回一个以原函数余下的参数为参数的数。 例如,定义两个整数相加的函数,一般函数的写法及其调用方式。如果使用函数柯里化,定义的函数可以改写成“addInt(1)(2)”实际上表示依次调用两个普通函数(非柯里化函数),第一次调用使用参数a返回一个函数类型的值,第二次使用参数b调用这个数类型的值。
使用if判断 在实际业务中,经常需要对数据进行过滤处理,使用if判断即可满足这个需求。Scala中的if判断根据复杂程度可分为if语句、if...else语句、if...else if...else语句、if...else 嵌套语句,使用i判断实现判断一个变量是否等于10,若是,则输出“x的值为10”,否则继续判断该变量是否等于 20,若是,则输出“x的值为 20”,否则输出“无法判断x的值”。
使用 for 循环 循环是指在某种条件下将一段代码按顺序重复执行。在Scala中有3种循环结构,分别为 while 循环、do...while 循环和 for 循环。for 循环是相对较为常用的一种循环,因此后文将介绍 for 循环的用法,例如,从1循环到 10,每循环一次则将该值输出,如图 2-22 所示。可以使用“atob”表示从a到b的区间(区间包含b),也可以使用“auntilb”表示从a到b的区间(区间不包含b)。 多重循环是常见的 for 循环,多重循环也称为 for 循环嵌套,是指在两个或多个区间内循环反复,多个循环区间用分号隔开。例如,使用 for 循环嵌套生成元组,。
Scala 可以在 for 循环中使用if判断过滤一些元素,多个过滤条件用分号隔开。输出 1~10中大于6的偶数。
for 循环使用 yield 可以将返回值作为一个变量存储,retVar 是变量名,for 关键字后的括号用于指明变量和条件,而 yield 会将每一次循环得到的返回值保存在一个集合中,循环结束后将返回该集合,并赋值给变量 retVar。 例如,使用 yield 对 1~10 的偶数进行记录,并保存至变量 even 中,可以看出 1~10 的偶数(2、4、6、8、10)已被保存为一个集合并赋值给了变量 even。
定义与使用列表 Scala 的列表(List)与数组非常相似,列表的所有元素都具有相同的类型。与数组不同的是,列表是不可变的,即列表的元素不能通过赋值进行更改。 定义列表时,需要写明列表元素的数据类型,具有类型个的元素的列表类型可写为 ListT. 或根据初值自动推断列表的数据类型。分别定义不同数据类型的列表,构造列表的两个基本单位是“Ni1”和“…:”。“Ni1”可以表示空列表;“…”称为中缀操作符,表示列表从前端扩展,遵循右结合。 Scala 中常用的査看列表元素的方法有 head、init、last、tail和 takeO)。其中 head 方法可查看列表的第一个元素,tail方法可查看第一个元素之后的其余元素,last可查看列表的最后一个元素,init 方法可査看除最后一个元素外的所有元素,take()方法可查看列表前n个元素。 如果需要合并两个列表,那么可以使用:()。但需要注意,“列表 1..:列表 2”与“列表 1…:(列表 2)”的结果是不一样的,对于前者,列表2的元素添加在列表1的后面;对于后者,列表2的元素添加在列表1的前面。合并两个列表还可以使用concat()方法。 用户可以使用 contains0)方法判断列表中是否包含某个元素,若列表中存在指定的元素则返回 true,否则返回 false。
定义与使用集合 集合(Set)是没有重复对象的,所有元素都是唯的,定义集合。Scala 也为集合提供了许多操作方法,常用的方法如表 2-6所示。Scala合并两个列表时使用的是::(0)或concat0方法,而合并两个集合使用的是++0方法,
定义与使用映射 映射(Map)是一种可迭代的键值对结构,所有值都可以通过键获取,并且映射中的键都是唯一的。另外映射还可以通过 keys 方法获取所有的键,通过values 方法获取所有值,也可以通过 isEmpty,方法判断映射的数据是否为空。映射对象 person 是否为空,若不为空则获取 person 所有的键和值。
定义与使用元组 元组(Tuple)是一种类似于列表的结构,但与列表不同的是,元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的。 例如,定义一个元组,元组中包含3个元素,对应的类型分别为(Int,Double,String)。 用户还可以通过定义元组,其中“Tuple3”中的3代表的是3元组即元组中包含3个元素,若定义的是n元组,则将“Tuple3”改为“Tuplen”。 目前,Scala 支持的元组最大长度为22,即 Scala 元组最多只能包含 22 个元素。访问元组元素可以通过“元组名称,元素索引”进行,索引从1开始。访问定义的元组t中的第1个元素与第3个元素。
使用函数组合器 Scala 为各种数据结构提供了很多函数组合器,函数组合器的参数都是一个函数,运用函数组合器的操作会对集合中的每个元素分别应用一个函数。以列表为例,介绍常用的函数组合器的用法。 1.map()方法可通过一个函数重新计算列表中的所有元素,并且返回一个包含相同数目元素的新列表。例如,定义一个 Int 类型列表,列表中的元素为 1~5,使用 map()方法对列表中的元素进行平方计算。 2.foreach()方法和 map()方法类似,但是 foreach()方法没有返回值,只用于对参数的结果进行输出。例如,使用 foreach0)方法对 num 中的元素进行平方计算并输出。 3.flter()方法可以移除传人函数的返回值为 false 的元素。例如,过滤列表 num 中的奇数,得到只包含偶数的列表。 4.flatten()方法可以将嵌套的结构展开,即fatten0方法可以将一个二维的列表展开成一个一维的列表。定义一个二维列表 list,通过 flatten0方法可以将 list 展开为一维列表。 5.fatMap()方法结合了map0方法和 fatten0方法的功能,接收一个可以处理嵌套列表的函数,再对返回结果进行连接。 6.groupBy()方法可对集合中的元素进行分组操作,返回的结果是一个映射。对1~10根据奇偶性进行分组,因此 groupBy()方法传人的参数是一个计算偶数的函数,得到的结果是个映射,包含两个键值对,键为 false 对应的值为奇数列表,键为 true 对应的值为偶数列表。
定义 Scala 类 Scala 是一种纯粹的面向对象语言,面向对象语言有两个重要的概念:类和对象。其中类是对象的抽象,也可以将类理解为模板,对象才是真正的实体。一个 Scala 源文件中可以有多个类,并且 Scala 类可以有参数。一般,Scala 类名的第一个字母需要大写,如果需要使用几个单词构成一个类的名称,那么每个单词的第一个字母都要大写。与 Java 等其他语言不同的是,Scala 中的类不定义为 public。
使用 Scala 单例模式 Scala 中没有 static 关键字,因此 Scala 的类中不存在静态成员。但是Scala 可以使用 object 关键字实现单例模式。 Scala 中使用单例模式时需要使用 object 定义一个单例对象(object 对象),单例对象在整个程序中只有一个实例。单例对象与类的区别在于单例对象不能带参数。
使用 Scala 模式匹配 Scala 具有强大的模式匹配机制,Scala 模式匹配的一般形式为“选择器match{备选项}”。一个模式匹配包含一系列备选项,每个备选项都开始于关键字 case。每个备选项都包含一个模式、一到多个表达式。模式和表达式之间使用“=>”隔开。 定义一个函数 matchTest,函数的参数为一个 Int类型变量,函数体的功能是对参数进行模式匹配。若参数匹配到的是1,则输出one;若参数匹配到的是2,则输出two;若参数匹配到的是除1和2之外的其他值,则输出 many。
读写文件 在实践操作中,常常需要进行文件的读/写操作。Scala不提供任何特殊文件写人能力因此进行文件的写操作时使用的是Java的 I/O 类中的 PrintWriter。例如,将“Iam learningScala”写人/opt 目录下的 test.txt 文件中。有时候需要接收用户在屏幕上输入的指令来处理程序,这时可以使用 Stdln.readLine 接收用户输人的指令。用户可以在 REPL 中直接输入“StdIn.readLine”命令并按“Enter”键并在屏幕上输人指令;也可以将 StdIn.readLine 赋值给一个变量,用户在屏幕上输入的内容即可赋值给该变量。使用 StdIn.readLime 接收用户输人的指令,并赋值给变量 line。其中,“lam happy”是用户在屏幕上输人的指令。
Scala 的基础内容,为 Spark 的编程学习奠定了基础 Scala的特性,介绍Scala数、运算符、循环、数据结构和类的使用。
树图思维导图提供 Linux 网络基础知识 在线思维导图免费制作,点击“编辑”按钮,可对 Linux 网络基础知识 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:199680f0e48eac8a1aeaadb90447d4f4
树图思维导图提供 第二章 组织及其绩效影响因素 在线思维导图免费制作,点击“编辑”按钮,可对 第二章 组织及其绩效影响因素 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:1919a947f88bc2d8550efe05fd639dac