scala基础
1.在scala命令交互行中,可以通过:load scala 文件路径,加载一个scala文件(此文件可以理解多行代码执行文件)
2.scalac scala文件路径 编译scala文件(此文件一般是一个有面方法的对象或者类的scala文件)
然后scala -classpath . 对象名或者类名的字节码文件路径,执行一个scala文件
scala 语法中 ";" 不是必要的可以省,只在必要的时候使用
编程基础语法scala篇中包括数据结构
第一章
大数据特点:
数据量大(Volume)
数据类型繁多(Variety)
处理速度快(Velocity)
价值密度低(Value)
hadoop的缺点与spark的优点
hadoop中的MapReduce计算模型延迟过高,难以胜任实时与快速计算。
缺点:
1.表达能力有限:计算时将任务转化为map与reduce操作但这并不适合所有情况的任务
2.磁盘i/o开销大:每次计算都从磁盘取出数据并在计算时将中间结果存入磁盘,i/o开销较大
3.延迟高:每一次计算都划分为一系列的map和reduce操作同时进行,任务的衔接涉及i/o开销延迟高,还有在前面的任务没有计算完成前需要等待,难以胜任复杂,多阶段的计算任务
优点:
1.spark的计算模式也属于MapReduce,但是不局限于此,还提供了多种数据集操作类型,编程模式更加灵活
2.Saprk提供了内存计算,中间结果直接放在内存中有更高的迭代运算效率
3.Spark是基于DAG的任务调度执行机制,优于MapReduce的迭代执行机制
略
第二章
面向对象编程基础:
类的定义:
省略规则0:当定义时类型值可以通过推测得到则可以省略":类型值"
例如var a=0 则a为Int类型
class 类名 {
val/var 字段名 =值//字段
def 方法名(参数列表):返回类型={方法体}//方法
方法的参数列表中不用var 与val修饰,默认就是val
一般如此 (a:Int,b:String,……)
省略规则1:
1.1当方法无参时() 允许省略,但是省略后调用时也要省略,如果不省略则调用时省不省均可
1.2调用方法时()可以使用 {}代替,方法如果只有一个参数调用时可以使用中缀操作符
即 对象.方法(参数) == 对象 方法 参数
1.3当方法的返回值类型可以由方法体最后一条语句值推断出可以省略":类型",如果方法体只有一条语句那么可以将{}省略
例如 def 方法名(参数列表) =println("输出语句")
1.4当方法的返回值类型可以由方法体最后一条语句值推断出且为Unit,可以省略":类型"并将 " = "也省略但是此时{} 不可省
补充:此时如果方法实际返回值不为Unit,仍会执行成功且自动改为Unit返回
}
补充:允许嵌套类,允许方法重载,允许方法名与字段名相同
成员可见性:
private 仅本类与嵌套类可见
protected 本类与子类可见
public 公开的 包内可见(不写默认)
注意字段一般为private 修饰,然后使用
字段名定义一个取值方法,使用字段名_ 定义一个改值方法。
省略规则2:当取值方法和改值方法成对出现时,允许调用改值方法时除去_,即同取值方法一样调用
构造器:
主构造器:class (参数列表){}
即在类名之后填上(参数列表)
请注意因此无参时("()"可以省略)时为无参构造
当参数列表中的参数使用var /val修饰时会自动在类中生成这个字段用private 修饰并自动生成取值(var 会一起生成改值)方法,否则为不可变,类域中的一个参数
辅助构造器:def this(参数列表){}
除了在类名处增加参数列表的主构造器以外,this(与主构造器参数相同的参数列表),即为在类内部调用主构造器
而第一个辅助构造器的域内的第一个语句应该为调用主构造器,第二个,第三个……的第一个语句通过调用前一级的构造方法,以区分自己的级数
是否同一级的能有多个尚无考证,有待研究。
允许this关键字
此处注意 在辅助构造器中的参数不能使用var/val 修饰
对象:
单例对象:object 类名{ }
可以通过类名称直接调用单例对象中的方法
类似于java中的static成员与块
当仅有单例对象定义时为孤立对象,当类与他的单例对象同时定义了,为伴生对象
因为单例对象不能被实例化所以理所当然他没有参数列表
apply方法:def apply(参数列表)={;实例化对象} 返回一个对象
有没有发现有时候我们会使用new实例化一个对象,但有时候我们却将new给省略了?
例如:val array=new Array(1,2,3) ==
val array=Array(1,2,3)
实际上是调用了Array的单例对象Array中的apply方法生成了一个对象
因为Array单例对象是不带参数列表的所以方便了scala在识别到了这种情况之后,会自动调用apply方法,并将参数列传入apply方法的参数列表相同的apply方法(重载)
请注意自定义单例对象并不会自带apply方法需要自己定义
unapply方法:def unapply(参数名:单例对象名):Option[(每个字段的类型)]={;some((每个字段))/None }
var 单例对象名(参数列表)= 对象
参数列表会接收每一个字段的值,所以参数列表一般个数就是字段个数即unapply为解构方法 (可以理解为当 "单例对象名(参数列表)"出现就可以自动调用apply或者unapply,当参数为实际数据时调用apply 当为参数变量时调用unapply并将类的字段值赋值与参数变量)
补充还有update等类似的方法,updata使得数据结构更新时类似与函数名(参数列表)
例如array(0)=5 实际是array.update(0,5)
继承:
抽象类:abstract class 类名(参数列表){
val/var 字段名:类型; 抽象子段
def 方法名(); 抽象方法
}
请注意抽象类中含有抽象的方法或者字段即可,正常的方法与字段是可以含有的,且抽象类不可实例化只能被继承
补充被final 关键字修饰的类为最终类不可以被继承
类的继承:class 子类名(参数列表) extends 父类名(参数列表){
override val 字段名=值
override def 方法名(参数列表):返回值类型={方法体}
……
}
类的重写:当父类的非抽象方法在子类进行重写时override 关键字是必须的,抽象则是默认不需要也可写(可以理解为没有实现的你实现了就归你了所以不写)
字段只重写val 因为var可以变(可以直接改别浪费内存去重写了),但是请注意如果该字段为抽象字段则必须重写(实现),否则本子类将应当加上abstract修饰成为抽象类
父类中的主构造器的var/val 修饰的字段也会同样生成或者说继承,因此当子类的主构造器中有相同字段(且var/val修饰)时需要在参数列表中添加 override修饰
子主构造器必须先调用父主构造器才能成功调用,因此子主构造器的参数列表必须每个参数的参数类型以及个数与父主构造器或者某个辅助构造器参数类型和个数相同。
注意子辅助构造器不能直接调用父构造器
不显著著名父类的类的父类一般为AnyRef 它的父类为Any
Null与Nothing:Null的唯一实例为null 它可以赋值给任意的引用对象,error的函数的返回值为Nothing 为任何类的子类
Option类: