赞
踩
Val:不可变,在声明时就必须进行初始化,且初始化后就不能被再次赋值
Var:可变,在声音是需要进行初始化,但后续还可以进行再次赋值
在Scala中声明变量必须有这两者其一的定义,但类型不是必须的,因为Scala可以自己判断。
输入:scala.io.Stdln read
输出:print()、println()、printf()
写入文件:java.io.PrintWriter
读取文件:Scala.io.Source getLines读取文件所有行
Scala不支持Java中的”受检查异常”,会将所有异常都当作“不受检异常”或运行时异常
Scala中的if表达式的值可以赋值给变量
While/do while 循环
与java中基本一致
for循环
格式:for(变量<-表达式) yield{语句块}、“变量<-表达式”被称为“生成器”generator;
*
Until 可以不包含终点、to包含终点值;yield可选*
可以使用“守卫”表达式,过滤出一些满足制定条件的结果
Scala同样支持多个生成器的情形,可以用分号进行分隔
Scala的for结构可以在每次执行的时候创造一个值,然后将包含了所有产生值的集合作为for循环表达式的结果进行返回,而集合的类型会由生成器中的集合类型确定。
For表达式是外部迭代器,可以同时控制循环或者处理多个集合,而foreach可以提供集合上的内部迭代器,不需要自己控制循环,只需要提供每次迭代上下文中执行的代码片段。
容器:Collection、列表:List、集合:Set、映射:Map、
迭代器:Iterator、数组:Array、元组:Tuple
Scala.collection、Scala.collection.mutable、Scala.callection.immutable
类型相同的不可变对象序列;
Scala的List一旦被定义,其值就不能改变,因此声明List时必须进行初始化;
列表有头部和尾部的概念,可以分表用head和tail来获取。head返回的是列表第一个元素的值,tail返回的是除第一个元素外的其它值构成的新列表;
集合是不重复元素的容器,是以“哈希”方法对元素值进行组织的,允许快速找到某个元素,但是集合中的元素并不会像列表一样记录元素的插入顺序;
集合包括可变集合和不可变集合,分别位于
Scala.collection.mutable、Scala.callection.immutable
映射是一系列键值对的容器,在一个映射中键是唯一的,但值不一定唯一,可以根据键来对值进行快速的检索。和集合一样,也分可变和不可变,默认情况下时不可变映射。
面向对象编程基础。
可以通过+=操作来添加新的元素
迭代器不是集合,而是访问集合的一种方法。有两个恶基本操作:next用于返回迭代器的下一个元素,而hasNext用于检测是否还有下一个元素。
Scala中,可以显示指定数组类型,也可以通过隐式推断来实例化一个数组。
Scala中Array提供了函数ofDim来定义二维和三维数组:
可以使用多级圆括号来访问多维数组的元素,例如:myMatrix(0)(1)
变长数组:ArrayBuffer
元组是不同类型的值的聚集。
Unit表示此方法没有返回值,类似void。Unit后面的等号和大括号后面,包含了该方法要执行的具体操作语句,如果大括号里面只有一行语句,可以直接去掉大括号;或者可以去掉返回值类型和等号,只保留大括号,即二者留其一。
新建对象
编译执行
Scala中的getter、setter
Scala中类似的方法分表叫做,value和value_=
辅助构造器
Scala构造器包含1个主构造器和若干个辅助构造器;
辅助构造器的名称为this,每个辅助构造器都必须调用一个此前已经定义过的辅助构造器或主构造器
Scala 的每个类都是主构造器,而主构造器是整个类体,需要在类名称后罗列出构造器所需的所有参数,这些参数会被编译成字段,字段的值就是创建对象时传入的参数的值。
单例对象
Scala没有提供Java那样的静态方法或静态字段,但可以采用object关键字实现单例对象,具备和Java静态方法同样的功能。
单例指的是只有一个实例的类,用单例可以表示那种对某些操作集中访问的对象,如数据库操作、对象工厂等。
伴生对象
在Java中,经常会使用到同时包含实例方法和静态方法的类,在Scala中可以通过伴生对象来实现;
当单例对象与某个类具有相同的名称时,它就会被称为这个类的“伴生对象”;
类和它的伴生对象必须存在于同一个文件中,而且可以相互访问私有成员(字段和方法);
其实伴生对象就是实现了Java中静态方法的功能;
Scala源码编译后都会变成JVM字节码,实际上编译编译过源码文件后,Scala里面的class和object会类似于Java层面都会被合二唯为一,class里面的成员变成了实例成员,而object成员变成了static成员。可以进行反编译进行查看验证。
应用程序对象
每个Scala应用程序都必须从一个对象的main方法开始
apply方法和updata方法
用括号传递给变量或对象,一个或多个参数时,Scala会把它转换成对apply的方法去使用;
对带有括号并包括一到若干参数的对象进行赋值时,编译器将会调用对象的update方法,在调用时,是把括号里的参数和等号右边的对象一起作为update方法的输入参数来执行调用。
Scala与Java的区别
重写一个非抽象方法必须使用override修饰符;
只有主构造器可以调用超类的主构造器;
在子类中重写超类的抽象方法时,不需要使用override关键字;
可以重写超类中的字段;
和Java一样,不允许类从多个超类继承;
抽象类
定义抽象类需要用abstract,定义抽象类的抽象方法,不需要abstract关键字,只要把方法体空着,不写方法体就可以;抽象类中定义的字段,只要没给出初始值,就表示一个抽象字段,并且该字段必须进行类型声明。
扩展类
extends
特质
在Java中有提供接口,允许一个类实现任意数量的接口,但在Scala中没有接口的概念,而是提供了“特质(trait)”,它不仅实现了接口的功能,还具备了很多其他的特性;
Scala的特质是代码重用的基本单元,可以同时拥有抽象方法和具体方法;
Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现多重继承。
特质中没有方法体的方法,默认就是抽象方法。
特质定义好后,就能使用extends或with关键字把特质混入类中。
简单匹配
match
对表达式的类型进行匹配
在模式匹配中添加一些处理逻辑
Case类的匹配
是一种特殊的类,专用于模式匹配
Option类型
标准类库中的Option类型用case类来表示那种可能存在、也可能不存在的值;
一般而言,对于每种语言来说,都会有一个关键字来表示一个对象引用的是“无”,在Java中使用的是null。Scala融合了函数式编程风格,因此,当预计到变量或者函数返回值可能不会引用任何值的时候,建议使用Option类型;
Option类包含一个子类Some,当存在可以被引用的值的时候,就可以使用Some来包含这个值。而None则会被声明为一个对象,而不是一个类,表示没有值。
Option类型还提供了getOrElse方法,这个方法在这个Option是Some的实例时,会返回对应的值,而在None的实例时会返回传入的参数。
函数定义
函数字面量
在函数式编程中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作,也就是说,函数的使用方法和其他数据类型的使用方法完全一致了。在Scala中函数和和其他变量一样,可以有值。函数和变量一样,有类型和值,函数的值就是函数字面量。
匿名函数、Lamda表达式与闭包
匿名函数的定义形式也被称为“Lamda表达式”
闭包是一种比较特殊的函数,反映了一个从开放到封闭的过程。
每次addMore函数被调用时都会创建一个新的闭包,每个闭包都会访问闭包创建时活跃的more变量。
占位符语法
为了让函数字面量更加简洁,可以使用下划线作为一个或多个参数的占位符,只要每个参数在函数字面量内仅出现一次。
这两个字面量是等价的
针对集合的操作
列表的遍历
for
foreach
映射的遍历
创建一个映射
遍历
foreach实现映射遍历
Map操作和flatMap操作
FlatMap是map的一种扩展,在flatmap中,我们会传入一个函数,该函数对每个输入都会返回一个集合(而不是一个元素),然后flatmap会把生成的多个集合 “拍扁”成一个集合。
filter操作
Scala中通过filter操作来实现,遍历一个集合并从中获取满足指定条件的元素组成一个新的集合。
创建映射:
使用filter操作:
Reduce操作
Reduce是二元操作,会对集合中的元素进行归约
Fold操作
折叠(fold)操作和归约(reduce)操作类似,fold操作需要从一个初始的“种子”开始,并以该值作为上下文,处理集合中的每个元素。
最近因为项目需要,正在学习Spark,以上仅是个人学习记录,为了便于后续复习回忆。主要内容来自于:Spark编程基础(Scala版) - 网易云课堂 找了很多入门学习的资料,这个还不错,是厦门大学林子雨老师的课。后续还会继续看一些相关的书籍资料进行学习,会继续补充。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。