大数据Spark“蘑菇云”行动-第26课:Scala的核心力量和黄金定律

从第26课开始,我们开始学习Scala的高级进阶,本课是Scala高级进阶第一课。


Scala的核心力量是什么?
1、自上而下和自下而上完美结合。
自上而下(对象):面向对象编程,软件系统由一个个对象组成,对象之间通过消息传递来完成。
自下而上(动作):函数式编程,强调功能的具体实现;
Scala把两者完美结合,核心是隐式转换、函数式编程。

2、数据状态不可变性
分布式多线程编程,要求对象状态不可更改,这样就可以简化编程、提升效率、减少Bug、方便分布式并发。
多线程加锁的代价非常大,如果数据状态不可变性,读取数据就不需要加锁。

3、类型系统+隐式转换
(Scala高手必须掌握类型系统)

4、函数式编程

5、Scala基于JVM可以直接调用Java的所有库和框架的功能。


Scala黄金定律
定律1:状态不可变
定律2:优先考虑面向值的编程方式,和不变性结合,简化编程代码
示例:

scala> val result =if(true) "Scala" else "Java"
result: String = Scala

下面的示例代码是最常规的一直方式:

def process(code:Int):String = {
    var result:String=""
    code match {
        case 0 => result="0"
        case 1 => result="1"
        case _  => result="1000"
    }
    result
}

接下来改造上面代码,采用面向值的方式,可以极大简化代码行数:

    def process(code: Int): String = code match {
      case 0 => "0"
      case 1 => "1"
      case _ => "1000"
    }

面向值的编程,一般都是和不可变性在一起。

定律3:多步骤操作对象是采用this.type构造链式表达式。
示例代码如下:

textFile.flatMap(line => line.split(" ")).map(word => (word, 1))

定律4:使用Option(None和Some),使用None取代Null。
Option可以像普通集合一样进行map等操作,简化代码。

scala> val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
capitals: scala.collection.immutable.Map[String,String] = Map(France -> Paris, Japan -> Tokyo)

scala> capitals.get( "France" )
res0: Option[String] = Some(Paris)

scala> capitals.get( "AAA" )
res1: Option[String] = None

定律5:使用伴生对象构造接口或者抽象类或者类的实例。

  object Graph {
  ......

  def apply[VD: ClassTag, ED: ClassTag](
      vertices: RDD[(VertexId, VD)],
      edges: RDD[Edge[ED]],
      defaultVertexAttr: VD = null.asInstanceOf[VD],
      edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
      vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY): Graph[VD, ED] = {
    GraphImpl(vertices, edges, defaultVertexAttr, edgeStorageLevel, vertexStorageLevel)
  }

  ...
 }


 object GraphImpl {

  /** Create a graph from edges, setting referenced vertices to `defaultVertexAttr`. */
  def apply[VD: ClassTag, ED: ClassTag](
      edges: RDD[Edge[ED]],
      defaultVertexAttr: VD,
      edgeStorageLevel: StorageLevel,
      vertexStorageLevel: StorageLevel): GraphImpl[VD, ED] = {
    fromEdgeRDD(EdgeRDD.fromEdges(edges), defaultVertexAttr, edgeStorageLevel, vertexStorageLevel)
  }
 }

本博声明:
博文内容源自DT大数据梦工厂大数据Spark“蘑菇云”前置课程。相关课程内容视频可以参考:
百度网盘链接:http://pan.baidu.com/s/1cFqjQu(如果链接失效或需要后续的更多资源,请联系QQ460507491或者微信号:DT1219477246 获取上述资料,或者直接拨打 18610086859咨询)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值