当前位置:   article > 正文

大数据技术——Scala语言基础_数据分析语言scala

数据分析语言scala

Scala基础知识

控制结构
if条件表达式

有一点与Java不同的是,Scala中的if表达式的值可以赋值给变量

while循环
for循环

基本语法

其中,“变量<-表达式”被称为“生成器(generator).”

“守卫(guard)"的表达式:过滤出一些满足条件的结果。

基本语法:

for (变量<-表达式if条件表达式) 语句块

Scala也支持“多个生成器”的情形,可以用分号把它们隔开,比如:

.for推导式: for结构可以在每次执行的时候创造一个值,然后将包含了所有产生值的集合作为for循环表达式的结果返回,集合的类型由生成器中的集合类型确定

for(变量<-表达式) yield{语句块}

异常处理

Scala不支持Java中的“受检查异常”(checked exception),将所有异常都当作“不受检异常”(或称为运行时异常)

Scala仍使用try-catch结构来捕获异常

对循环的控制

为了提前终止整个循环或者跳到下一个循环,Scala没有break和continue关键字

Scala提供了一个Breaks类(位于包scala.util.control) 。

Breaks类有两个方法用于对循环结构进行控制,即breakable和break

数据结构
数组

数组:一种可变的、可索引的、元素具有相同类型的数据集合

Scala提供子参数化类型的通用数组类Array[T],其中干可以是任意的Scala类型,可以通过显式指定类型或者通过隐式推断来实例化一个数组

  • 声明一个整形数组

  • 声明一个字符串数组

可以不给出数组类型,Scala会自动根据提供的初始化数据来推断出数组的类型

多维数组的创建:调用Array的ofDim方法

可以使用多级圆括号来访问多维数组的元素,例如myMatrix(0)(1)返回第一行第二列的元素

元组

元组是对多个不同类型对象的一种简单封装。

定义元组最简单的方法就是把多个元素用逗号分开并用圆括号包围起来。使用下划线“_”加上从1开始的索引值,来访问元组的元素

如果需要在方法里返回多个不同类型的对象,Scala可以通过返回一个元组来实现

容器

·Scala提供了一套丰富的容器(collection)库,包括序列( Sequence)、集合(Set)、映射(Map)等

.Scala用了三个包来组织容器类,分别是

scala.collection 、scala.collection.mutable和scala.collection.immutable

scala.collection封装了可变容器和不可变容器的超类或特质,定义了可变容器和不可变容器的一些通用操作

scala.collection包中容器的宏观结构

序列

序列(Sequence):元素可以按照特定的顺序访问的容器。序列中每个元素均带有一个从0开始计数的固定索引位置

序列容器的根是collection.Seq特质。其具有两个子特质LinearSeq和IndexedSeq …

LinearSeq序列具有高效的head和 tail操作,而IndexedSeq序列具有高效的随机存储操作

实现了特质LinearSeq的常用序列有列表(List)和队列( Queue)。

实现了特质IndexedSeq的常用序列有可变数组(ArrayBuffer)和向量(Vector)

序列——列表

  • 列表:一种共享相同类型的不可变的对象序列。定义在scala.collection.immutable包中

  • 不同于Java的java.util.List,scala的List一旦被定义,其值就不能改变,因此声明List时必须初始化

var strList=List("BigData","Hadoop","Spark")

  • 列表有头部和尾部的概念,可以分别使用head和tail方法来获取

  • head返回的是列表第一个元素的值

  • tail返回的是除第一个元素外的其它值构成的新列表,这体现出列表具有递归的链表结构

  • strList.head将返回字符串”BigData”,strList.tail返回List("Hadoop","Spark")

构造列表常用的方法是通过在已有列表前端增加元素,使用的操作符为::,例如:

val otherList="Apache":.strList

执行该语句后strList保持不变,而otherList将成为一个新的列表:

List("Apache","BigData","Hadoop","Spark")

Scala还定义了一个空列表对象Nil,借助Nil,可以将多个元素用操作符::串起来初始化一个列表

val intList = 1::2::3::Nil与val intList = List(1,2,3)等效

注意:除了head、tail操作是常数时间O(1),其它按索引访问的操作都需要从头开始遍历,因此是线性时间复杂度O(N)

序列——向量

Vetor可以实现所有访问操作都是常数时间。

序列——Range

·Range类:一种特殊的、带索引的不可变数字等差序列。其包含的值为从给定起点按一定步长增长(减小)到指定终点的所有数值

· Range可以支持创建不同数据类型的数值序列,包括Int、Long、 Float、Double、 Char、Biglnt和BigDecimal等

(1)创建一个从1到5的数值序列,包含区间终点5,步长为1

(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1

(3)创建一个从1到10的数值序列,包含区间终点10,步长为2

(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.3f

集合

·集合(set):不重复元素的容器(collection)

·列表(List)中的元素是按照插入的先后顺序来组织的,但是,“集合”中的元素并不会记录元素的插入顺序,而是以“哈希”方法对元素的值进行组织,所以,它允许你快速地找到某个元素

集合包括可变集和不可变集,分别位于scala.collection.mutable包和scala.collection.immutable包,缺省情况下创建的是不可变集

如果要声明一个可变集,则需要提前引入scala.collection.mutable.Set

映射

·映射(Map):一系列键值对的容器键是唯一的,但值不一定是唯一的。可以根据键来对值进行快速的检索

Scala的映射包含了可变的和不可变的两种版本,分别定义在包scala.collection.mutablescala.collection.immutable里。

默认情况下,Scala中使用不可变的映射。如果想使用可变映射,必须明确地导入scala.collection.mutable.Map

如果要获取映射中的值,可以通过键来获取

对于这种访问方式,如果给定的键不存在,则会抛出异常,为此,访问前可以先调用contains方法确定键是否存在

可变的映射

也可以使用+=操作来添加新的元素

迭代器

·迭代器( lterator)不是一个容器,而是提供了按顺序访问容器元素的数据结构

·迭代器包含两个基本操作: next和hasNext

next可以返回迭代器的下一个元素,hasNext用于检测是否还有下一个元素

建议:除next和hasnext方法外,在对一个迭代器调用了某个方法后,不要再次使用该迭代器

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/864422
推荐阅读
相关标签
  

闽ICP备14008679号