Map
Map:k,v键值对,跟java里的Map差不多的意思。
SortedMap和LinkedHashMap
SortedMap 是排序的Map,按照Key进行排序
LinkedHashMap 是一个可变的Map,同时它会记录数据插入顺序
定义一个Map有以下几种方式:
val map = Map("book"->10,"gun"->18,"ipad"->1000)
val scores = scala.collection.mutable.Map("Scala" -> 7, "Hadoop" -> 8, "Spark" -> 10 )//可变的Map
val sortedScore = scala.collection.immutable.SortedMap("Scala" -> 7, "Hadoop" -> 8, "Spark" -> 10 )//按照key排序
Map增加、删除键值对:
scores += ("R" -> 9)//添加元素
scores -= "Hadoop"//删除元素
Map的取值:
val hadoopScore = scores.getOrElse("Hadoop", 0)
Map的遍历:
for((k,v) <- map) yield (k,v * 0.9)
如果只想取key,可以使用如下方式:
for((k,_) <- map){ //placeholder
println("Key is " + k)
}
Tuple(元组)
Scala中的重要特性,Tuple可以存储任何类型的值,同时也可以存储Tuple,并且取值比较简单,操作方便
Tuple的定义:
val tuple =(1,2,3.14,"Rocky","Spark","Flink")
Tuple的取值:
val third = tuple._1//和数组不同的是,下标从1开始。还能tuple _3这种方式访问,不过不建议
Tuple其它操作:
val (first,second,thirda,fourth,fifth,sixth) = tuple//将tuple赋值给另一个tuple
val (f, s, _, _, _,_) = tuple//对于不想要的值,可以使用占位符
"Rocky Spark".partition(_.isUpper)//partition返回一个tuple:(String, String) = (RS,ocky park)
ZIP(拉链)
将两个Array的数据合并起来,形成一个大Array,新的Array元素是一个个的Tuple
val symbols = Array("[", "-", "]")
val counts = Array(2,5,2)
val pairs = symbols.zip(counts)
结果:Array[(String, Int)] = Array(([,2), (-,5), (],2))
面向对象(重点)
-
面向对象编程之类
伴生类:和object同名的,叫做伴生类,而且在伴生类中定义私有的(private)方法和属性,都可在伴生对象中使用,伴生类也可以调用object私有的方法和属性,用private[this]声明的方法或属性不能被调用
构造器:分为主构造器和辅助构造器,辅助构造器在定义完成后,第一步就需要实现主构造器的构造参数,然后才可以去实现辅助构造器,并且在Scala中辅助构造器和主构造器相当于Java中 的无参方法和有参方法。
-
面向对象编程之对象
如果在对象当中进行定义变量和方法,那么我们使用的时候,不需要在New当前的这个对象了,直接使用对象中的变量和方法,也就是说,不需要像类一样实例化。
对象可以实现序列化功能,不需要继承序列化接口
在对象中定义的方法和属性,会初始化一次,下次不需要在进行创建和初始化,直接使用,同时对象就相当于静态方法一样
一般定义的一些常量和connection连接使用对象进行声明或者创建
伴生对象:和class类同名的,叫做伴生对象,可以相互访问私有的属性和方法
让Object继承抽象类
Object可以继承抽象类,同时实现抽象方法,但是在object中不可以进行传参,也就是不能实现构造器
Apply初始化
在我们操作时,比如用Object进行定义的方法属性都会进行默认的初始化操作,也就是说会默认调用.apply()方法
-
面向对象编程之继承(extends)
在Scala中继承特性和Java一样,都是子类继承父类,拥有父类的方法和属性,当然私有的除外,同时也可也去覆盖父类的方法和属性(Override)如果想调用父类方法或属性,也可以用super进行调用
父类子类类型转换(isInstanceOf和asInstanceOf)
类型转换,可以进行子类与父类之间转换,同时也可以进行基本数据类型之间的转换操作,而且可以先进行判断,在进行转换操作
getClass和ClassOf 相比上面的转换,它更精准一些,但是本质是一样的,都是转换类型
抽象类:抽象类不可以被实例化
抽象方法:没有被实现方法,叫做抽象方法
抽象变量:定义变量,但是没有给出具体的初始值,则称为抽象变量
-
面向对象编程之trait(接口)
Scala中的Trait是一个特殊的概念
Trait与Java中的接口类似,但是进行继承的时候,不使用implement,而是使用extends进行继承,一般在Spark 的代码中,主要是运于打印日志,如果进行继承接口(Trait)用extends,那么如果继承多个trait,用with。
Trait内部可以定义变量(抽象变量),方法(抽象方法),可以实现多重继承,使用with
Trait继承class,同时继承class之后,又可以被继承
函数式编程(重点)
定义:(x:Int,y:Int)=>{x+y}
高阶函数:map、filter、reduce、sortWith、sortBy、sorted、flatMap、flatten等等