scala02

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))

面向对象(重点)
  1. 面向对象编程之类

    伴生类:和object同名的,叫做伴生类,而且在伴生类中定义私有的(private)方法和属性,都可在伴生对象中使用,伴生类也可以调用object私有的方法和属性,用private[this]声明的方法或属性不能被调用

    构造器:分为主构造器和辅助构造器,辅助构造器在定义完成后,第一步就需要实现主构造器的构造参数,然后才可以去实现辅助构造器,并且在Scala中辅助构造器和主构造器相当于Java中 的无参方法和有参方法。

  2. 面向对象编程之对象

    如果在对象当中进行定义变量和方法,那么我们使用的时候,不需要在New当前的这个对象了,直接使用对象中的变量和方法,也就是说,不需要像类一样实例化。

    对象可以实现序列化功能,不需要继承序列化接口

    在对象中定义的方法和属性,会初始化一次,下次不需要在进行创建和初始化,直接使用,同时对象就相当于静态方法一样

    一般定义的一些常量和connection连接使用对象进行声明或者创建

    伴生对象:和class类同名的,叫做伴生对象,可以相互访问私有的属性和方法

    让Object继承抽象类

    Object可以继承抽象类,同时实现抽象方法,但是在object中不可以进行传参,也就是不能实现构造器

    Apply初始化

    在我们操作时,比如用Object进行定义的方法属性都会进行默认的初始化操作,也就是说会默认调用.apply()方法

  3. 面向对象编程之继承(extends)

    在Scala中继承特性和Java一样,都是子类继承父类,拥有父类的方法和属性,当然私有的除外,同时也可也去覆盖父类的方法和属性(Override)如果想调用父类方法或属性,也可以用super进行调用

    父类子类类型转换(isInstanceOf和asInstanceOf)

    类型转换,可以进行子类与父类之间转换,同时也可以进行基本数据类型之间的转换操作,而且可以先进行判断,在进行转换操作

    getClass和ClassOf 相比上面的转换,它更精准一些,但是本质是一样的,都是转换类型

    抽象类:抽象类不可以被实例化

    抽象方法:没有被实现方法,叫做抽象方法

    抽象变量:定义变量,但是没有给出具体的初始值,则称为抽象变量

  4. 面向对象编程之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等等

Scala中,flatMap是一个用于集合操作的函数,它可以将嵌套的集合展平,并且可以应用于任何实现了FlatMap特质的集合类型。它的作用是将集合中的每个元素应用一个函数,这个函数返回一个子集合,然后将所有的子集合合并成一个新的集合。 举个例子,假设我们有一个包含字符串的列表listStr01,我们想要将每个字符串按空格切割,并将切割后的元素放入一个新的列表listStr02中。我们可以使用flatMap函数来实现这个操作: ``` val listStr01 = List("hello word", "hello hdfs", "hadoop hdfs") val listStr02 = listStr01.flatMap(_.split(" ")) listStr02.foreach(println) ``` 在上面的代码中,我们使用flatMap将listStr01中的每个字符串按空格切割成多个元素,并将这些元素放入listStr02中。最后,我们使用foreach函数打印出listStr02中的所有元素。 另外,flatMap还可以用于RDD(弹性分布式数据集)的操作。例如,在Spark中,我们可以使用flatMap操作来将一个RDD中的每个元素按照某种规则进行扁平化处理。下面是一个使用flatMap操作的例子: ``` val lineArray = Array("hello you","hello me","hello world") val lines = sc.parallelize(lineArray, 1) val words = lines.flatMap(line => line.split(" ")) words.foreach { word => println(word.mkString) } ``` 在上面的代码中,我们将lineArray转换为一个RDD对象lines,然后使用flatMap操作将每个元素按空格切割,并得到一个扁平化的RDD对象words。最后,我们使用foreach函数打印出words中的所有元素。 总结起来,flatMap函数在Scala中用于集合操作,可以将嵌套的集合展平。它可以应用于各种集合类型,并且可以按照某种规则将集合中的元素转换成新的集合。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值