当前位置:首页 > 开发 > 编程语言 > 大数据 > 正文

【Scala六】分析Spark源代码总结的Scala语法四

发表于: 2015-02-19   作者:bit1129   来源:转载   浏览:
摘要: 1. apply语法   FileShuffleBlockManager中定义的类ShuffleFileGroup,定义:   private class ShuffleFileGroup(val shuffleId: Int, val fileId: Int, val files: Array[File]) { ... def apply(bucketId

1. apply语法

 

FileShuffleBlockManager中定义的类ShuffleFileGroup,定义:

 

private class ShuffleFileGroup(val shuffleId: Int, val fileId: Int, val files: Array[File]) {
  ...
  def apply(bucketId: Int) = files(bucketId)
  ...
}

 

那么当我们新建了ShuffleFileGroup对象后,

   val fileGroup = new ShuffleFileGroup(shuffleId, fileId, files)

 

执行如下如下操作 val file = fileGroup(0),那么它自动调用ShuffleFileGroup类的apply方法,这里返回的是files这个File数组的第一个文件

Scala allows classes to define a special function named apply that is called when we treat an object as if it were a function, so head(5) is the same thing as head.apply(5). 这里head是个Array数组对象

In Scala, apply methods have some special syntactic sugar that allows us to call them without having to type them out explicitly; for example, these two lines do exactly the same thing:
val nastats = NAStatCounter.apply(17.29)
val nastats = NAStatCounter(17.29)

 

NAStatCounter这里是NAStatCounter类的伴生对象,在半生对象上调用apply方法,可以用于创建类对象

 

 

 

 

 

2.二维数组

代码来自于DiskBlockManager.scala

fill操作是产生一个长度为第一个参数的数组,同时每个元素使用第二个参数进行填充,这里第二个参数是个数组,因此这样就定义了一个二维数组

 

 

  private val subDirs = Array.fill(localDirs.length)(new Array[File](subDirsPerLocalDir))

 

 

二维数组的两个维度分别用()()表示,这跟Java的二维数据a[0][0]道理一样,只不过Scala使用a(0)(0)来对于第一个元素

 

    var subDir = subDirs(dirId)(subDirId)

 

 

3. for嵌套循环

忘记了在Spark的什么地方看到的这个语法现象,在scala终端上试了下才发现原来是嵌套循环

 

scala> val a1 = List(1,2,3)
a1: List[Int] = List(1, 2, 3)

scala> val a2 = List(4,5,6)
a2: List[Int] = List(4, 5, 6)

 

 

scala> for(s1 <- a1; s2 <- a2) {println("s1=" + s1 + ",s2=" + s2)}
s1=1,s2=4
s1=1,s2=5
s1=1,s2=6
s1=2,s2=4
s1=2,s2=5
s1=2,s2=6
s1=3,s2=4
s1=3,s2=5
s1=3,s2=6

 可见这是个循环遍历a1和a2的操作,同时由输出结果可以看到,s1<-a1是外层循环,s2<-a2是内层循环

 

【Scala六】分析Spark源代码总结的Scala语法四

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

我来说两句
评论内容:
验  证  码:
 
(网友评论仅供其表达个人看法,并不表明本站同意其观点或证实其描述。)
评论列表
已有 0 条评论(查看更多评论)
编辑推荐
Clojure首先是FP, 但是由于基于JVM, 所以不得已需要做出一些妥协, 包含一些OO的编程方式 Scala首先
本文中,我们将首先讨论如何在本地机器上利用Spark进行简单分析。然后,将在入门级水平探索Spark,
1,首先介绍官网网站 http://scala-lang.org/ 下载windows 的exe直接进行安装就行。 安装后有个本地
为了在IDEA中编写scala,今天安装配置学习了IDEA集成开发环境。IDEA确实很优秀,学会之后,用起来很
工作以及兴趣所致,开始了spark学习之旅,浏览网上大牛们的博客 文章,并且结合官网docs,刚开始云
计划: 阶段1: 精通Spark内核 阶段2: 精通千万级的项目 阶段3: 机器学习 JAVA本身不是伟大的语言
http://www.cnblogs.com/byrhuangqiang/p/4017725.html 为了在IDEA中编写scala,今天安装配置学习了
1,首先介绍官网网站 http://scala-lang.org/ 下载windows 的exe直接进行安装就行。 安装后有个本地
cala中特质定义:包含一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,可以方便的实
cala中特质定义:包含一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,可以方便的实
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号