`
wbj0110
  • 浏览: 1546570 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Scala——集合

 
阅读更多

主要的集合特质

Scala中所有的集合都扩展了Iterable特质。集合又可以分为三类:有先后次序的序列Seq;值的集合Set;键值对构成的对偶的映射Map。三类集合下分别还实现了特殊访问方式的特质:可以由下标来进行随机访问的IndexedSeq;可按照顺序访问的SortedSet;可按顺序访问的SortedMap。

迭代器

在迭代器之前,已经介绍了集合的不少使用方法,多是带有函数式特征的。而且在Scala中,也更加鼓励使用这些方法来进行操作。在面向对象编程中,迭代器是更加常见的,用来操作集合的方法。

对于完整构造需要很大开销的集合来说,使用迭代器是个不错的想法。比如在用Source.fromFile读取文件的时候。使用迭代器时,只有在需要的时候才去取元素,所以不会一次性将文件全部读取到内存。而使用迭代器时,需要注意的当然是迭代器是否有效,以及迭代器的指向位置。

流(A3)

流,stream,是一个尾部被懒计算的不可变列表。流会缓存下中间计算过的值,所以可以重新访问已经访问过的值,这点是与迭代器不同的。

懒视图

其他的集合也可以得到懒(lazy)计算相似的效果。使用集合的view方法。懒视图不会存储已经计算过的值。

懒视图可以用来避免构建大型中间集合,适合于处理需要多种方式进行变换的大型集合。

在上面的代码中,就避免了从pow方法中构建的中间集合map。

线程安全的集合

可变集合可以混入特质来使集合的操作变为同步的。这样的特质共有六个,都以Synchronized开头,详细的我就不列了。

需要注意的是,混入特质后,只是将操作变为同步的,并不能保证集合是线程安全的。(比如,并发进行修改和遍历集合。)

通常可以使用java.util.concurrent包中的类来保证线程安全,而且可以将这些集合也转换成Scala集合来使用(使用JavaConversions)。

并行集合

在Scala中可以方便地得到一个集合的并行实现。

上面的代码中coll是一个大型集合,而par方法会得到集合的并行实现——会尽可能地并行地执行结合方法。将上面的求和来说明,集合会被分成多个区块,然后由多个线程来对这些区块来进行求和,最后将区块的结果汇总得到最终的和。

par方法返回的是ParIterable的子类型,但ParIterable并不是Iterable的子类型。可以使用ser方法将并行集合转换回串行集合。

http://nerd-is.in/2013-09/scala-learning-collections/


本章的内容虽然多,但基本都是些用久了没不会有问题的内容。不过集合用来增删的操作真是有点多啊。

 

分享到:
评论

相关推荐

    Scala in Depth

    本书由Scala之父作序推荐,深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书示例丰富,是...

    积分java源码-scala-collection-laws:为整个集合库部分自动生成测试

    警告——这是对早期版本的完全重写! 早期版本的 scala-collection-laws 有几个奇怪的基于文本的 DSL。 这已被放弃,取而代之的是带有sourcecode插件的纯 Scala 代码,有助于生成有意义的自动报告。 快速开始 克隆存...

    Scala语法(iterator迭代器)

    scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合 使用迭代器遍历集合 使用iterator方法可以从集合获取一个迭代器 迭代器的两个基本操作 hasNext——查询容器中是否有下一个元素 next——返回...

    Scala 基础语法

    我们可以认为 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递。接下来我们来理解下,类,对象,方法,实例变量的概念: 对象 – 对象有属性和行为。例如:一只狗的状属性有:颜色,名字,行为有:叫、跑...

    Scala数据结构

    数据结构——容器 容器(Collection) Scala中容器包 Scala的容器(collection)库 在Iterable(可迭代的)下的继承层次包括三个特质: 三种容器最大的区别是其元素的索引方式 序列(Seq):按照从0开始的整数进行...

    13集合

    1.Scala中的集合有三大类: 序列 Seq --> (List) 集 Set 映射 Map --> 键值对(HashMap) 2.介绍 所有集合都来自于Iterable特质(相当于Java中接口)。 集合也存在可变(mutable)和不可变(immutable)。 immutable...

    spark 2.0 详解

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    Apache Hadoop---Spark.docx

    与Hadoop不同,Spark和Scala能够紧密集成,其中的Scala可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建Spark是为了支持分布式数据集上的迭代作业,但是实际上它是对Hadoop的补充,可以在Hadoop文件...

    java8集合源码-IteRace:Java并行循环的竞争检测

    中的竞争——它只会告诉您您无意中共享了一个特定的 HashSet 对象。 基于类的线程安全模型过滤竞争。 比这稍微复杂一些,但是,例如,您不会收到关于 AtomicInteger 的竞争报告。 您可以在我们的 . 入门 IteRace在...

    Spark官方中文文档

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    Spark大型集群上的快速和通用数据处理架构

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    Spark亚太研究院-Spark实战高手之路

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    spark Core RDD持久化详解

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    Spark大数据处理:技术、应用与性能优化

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    1.1.1 Spark基础入门

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...

    kotlin compiler

    其基础编译器(他们将其改为kompiler——开创了一系列以K字打头的用语——甚至连 contributors这类词他们也用改成了kontributors)可以被独立出来并嵌入到 Maven、Ant 或 Gradle 工具链中。这使得在 IDE 中开发的...

    大规模数据处理计算引擎Spark2.x教程(含资料)

    Apache Spark 是专为大规模数据处理而设计...与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,

    akkit:Akkit 是一个有用的通用 Akka actor 和模块的集合

    Akkit 是一个有用的通用 Akka actor 和模块的集合。 安装 Akkit 已发布到 Sonatype OSSRH,因此您要做的就是将以下依赖项添加到您的build.sbt : libraryDependencies ++ = Seq ( " ...

    各大数据组件介绍.pdf

    与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作 本地集合对象⼀样轻松地操作分布式数据集。 Spark 主要有三个特点[2] : ⾸先,⾼级 API 剥离了对集群本⾝的关注,Spark 应⽤开发者可以专注...

Global site tag (gtag.js) - Google Analytics