文档章节

第十章 Scala 容器(一):整体介绍

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/04/01 17:20
字数 654
阅读 354
收藏 0

1. 整体架构

    Scala容器类是非常丰富的,整体架构也比较复杂,下面我们来根据图(10-2)来认识一下。Scala的容器类都是从Traversable和Iterable这两个trait开始的,然后分为三大类,分别是Seq,Set和Map,然后Seq又分为IndexedSeq和LinearSeq两种。其中IndexedSeq可以理解为数组形式,类似于Java中的ArrayList,而LinearSeq是以链表的形式存储的,类似于Java中的LinkedList。然后我们回来再看一下顶端的两个trait,其中Traversable允许你通过for each来重复遍历容器中的内容,而Iterable允许你使用Iterable遍历整个容器,区别是实用iterable遍历容器时,对于容器内的每个元素只能遍历到一次,这一点鹤Java的Iterable保持一致。

2. Seq

    我们来看一下Seq的架构图,刚才已经提到Seq分类IndexedSeq和LinearSeq两大类。

    其中IndexSeq允许你通过索引(下标)来随机访问,比如你想获取容器内下标为5000的值,你可以直接使用IndexedSeq(5000)来实现,IndexdSeq的默认实现为Vector。

scala> val x = IndexedSeq(1,2,3)
x: IndexedSeq[Int] = Vector(1, 2, 3)

scala> x(1)
res22: Int = 2

    而LinearSeq被高效的划分为头和尾部,其中头是容器内的第一个元素,而尾部为除了头元素之外剩余的所有元素。我们可以方便的使用head和tail已经isEmpty方法来访问LinearSeq容器。LinearSeq的默认实现为List。

scala> val seq = collection.immutable.LinearSeq(1,2,3)
seq: scala.collection.immutable.LinearSeq[Int] = List(1, 2, 3)

scala> seq.head
res23: Int = 1

scala> seq.tail
res24: scala.collection.immutable.LinearSeq[Int] = List(2, 3)

scala> seq.isEmpty
res25: Boolean = false

3. Map

    Map作为一个存储键值对的容器(key-value),其中key值必须是唯一的,结构见图(10-4)。

    默认情况下,我们可以通过Map直接创建一个不可变的Map容器对象,这时候容器中的内容是不能改变的。如果你想获得一个内容可变的Map,那么必须使用scala.collection.mutable.Map来创建。

scala> val m = Map(1 -> "a", 2 -> "b")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

scala> val m = scala.collection.mutable.Map(1 -> "a", 2 -> "b")
m: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)

4. Sets

    Scala中的Set和Java中的Set一样,存储的内容是不可重复的。

    默认情况下,我们可以通过Set直接创建一个不可变的Set容器。和Map一样你可以使用mutable包中的Set来创建一个可变的Set容器。

scala> val set = Set(1,2,3)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> val set = collection.mutable.Set(1,2,3)
set: scala.collection.mutable.Set[Int] = Set(1, 2, 3)


© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
加载中

评论(1)

这些年了1990
这些年了1990
好文
【原创】《深入剖析Tomcat》读书笔记

第一章 一个简单的Web服务器 第二章 一个简单的servlet容器 第三章 连接器 第四章 Tomcat的默认连接器 第五章 servlet容器 第六章 生命周期 第七章 日志记录器 第八章 载入器 第九章 Sessio...

pandudu
2015/12/22
46
0
第十章 Scala 容器基础(七):用Vector作为你指定的不可变序列

问题: 你需要为你的Scala应用选择一个快速,通用的不可变序列集合类型,那么该如何选择呢? 解决: Vecotr类目前可以被认为是这么一个通用的不可变数据结构。Vector是一个带索引的不可变序列...

阿拉德大陆的魔法师
2016/04/10
1K
0
系统的学习大数据分布式计算spark技术

我们在学习一门技术的时候一定要以系统的思维去学习,这样的话,不仅对你的提高有很大的帮助,也可以让你高效的使用这个技术。 对于学习spark,当然也是要以系统的思维去全面的学习。这篇博客...

tangweiqun
2017/09/24
0
0
第十章 Scala 容器基础(八):用ArrayBuffer作为你指定的可变序列

问题: 你如何选择一个通用的可变序列在你的Scala应用中。 解决: 正像Vector被推荐作为不可变序列容器的指定类,ArrayBuffer则被推荐作为通用的可变序列容器指定类。(ArrayBuffer是带索引的...

阿拉德大陆的魔法师
2016/04/10
780
0
《吴恩达 - 机器学习 - 笔记》文集小结

该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。 这里笔者要絮絮叨叨一番: 其实...

tomas家的小拨浪鼓
03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 ——不知道假装开心,装的像么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :天黑了 你很忧愁, 你说世界上, 找不到四块五的妞, 行走在凌晨两点的马路上, 你疲倦地拿着半盒黄鹤楼。#今日歌曲推荐# 《四块...

小小编辑
今天
2.1K
16
64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
68
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
32
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
112
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部