文档章节

第十章 Scala 容器基础(二十七):元组

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/04/19 15:02
字数 698
阅读 105
收藏 0

Problem

    你想要创建一个集合,集合元素类型是多样的。

Solution

    元组为你提供了一种方式来存储不同类型的元素在一个容器内,这在许多情况下是非常有用的。

    新建一个元祖通过把需要的额元组包在一组小括号内。下面是一个二元祖:

scala> val d = ("Debi", 95)
d: (String, Int) = (Debi,95)

    注意,它包含了两个不同的类型。下面这个例子展示了三元祖:

scala> val t = (3, "three", new Person("Al"))
t: (Int, String, Person) = (3,three,Person(Al))

    你可以使用下标来访问元组元素:

scala> t._1
res0: Int = 3

scala> t._2
res1: String = three

scala> t._3
res2: Person = Person(Al)

    我通常情况下通过模式匹配来把元祖元素复制给一个变量:

scala> val (x, y, z) = (3, "three", new Person("Al"))
x: Int = 3
y: String = three
z: Person = Person(Al)

    这种解决方案还有一个非常美妙的好处在于,如果你不需要某一个元素,那么你可以使用_这个通配符来代替这个元素:

scala> val (x, y, _) = (3, "three", new Person("Al"))
x: Int = 3
y: String = three

scala> val (x, _, _) = (3, "three", new Person("Al"))
x: Int = 3

scala> val (x, _, z) = (3, "three", new Person("Al"))
x: Int = 3
z: Person = Person(Al)

    二元祖是Tuple2 class的实例,三元祖是Tuple3 class的实例。下面是创建二元祖最简单的方式:

scala> val a = ("AL", "Alabama")
a: (String, String) = (AL,Alabama)

    你还可以使用下面的方式创建元组:

scala> val b = "AL" -> "Alabama"
b: (String, String) = (AL,Alabama)

scala> val c = ("AL" -> "Alabama")
c: (String, String) = (AL,Alabama)

    如果你查看他们的类型,你会发现他们都是Touple2:

scala> a.getClass
res6: Class[_ <: (String, String)] = class scala.Tuple2

scala> b.getClass
res7: Class[_ <: (String, String)] = class scala.Tuple2

scala> c.getClass
res8: Class[_ <: (String, String)] = class scala.Tuple2

    这种语法结构还能用来创建Map:

scala> val map = Map("AL" -> "Alabama")
map: scala.collection.immutable.Map[String,String] = Map(AL -> Alabama)

Discussion

    元组是一个非常有趣的结构。但元素元组是不存在的;API中定义了tuple类是从Touple2到Touple22,一位置你可以拥有一个2元到22元的元组。

    元组的一个通用情况是方法返回多个结果。这时候使用一个元组作为返回值而不是集合。虽然tuple不是一个集合,但是你可以把一个元组作为一个集合使用。

scala> val x = ("AL" -> "Alabama")
x: (String, String) = (AL,Alabama)

scala> val it = x.productIterator
it: Iterator[Any] = non-empty iterator

scala> for (e <- it) println(e)
AL
Alabama

    使用iterator遍历元组,在使用完一次以后,就不能再用了。如果你需要再次遍历这个元组,那么你需要构造一个新的iterator来使用。

    你也可以转换一个元组成为一个集合:

scala> val t = ("AL", "Alabama")
t: (String, String) = (AL,Alabama)

scala> t.productIterator.toVector
res13: Vector[Any] = Vector(AL, Alabama)


© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
Scala编程指南——用更少的字做更多的事

本文为《Programming Scala》的中文译文《Scala 编程指南》的第二章,在《Scala语言编程入门指南》我们介绍了Scala语言编程的入门,在上一章中我们以几个撩拨性质的Scala 代码范例作为章节结...

mj4738
2011/11/01
1K
0
第十章 Scala 容器基础(七):用Vector作为你指定的不可变序列

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

阿拉德大陆的魔法师
2016/04/10
1K
0
第十章 Scala 容器(一):整体介绍

整体架构 Scala容器类是非常丰富的,整体架构也比较复杂,下面我们来根据图(10-2)来认识一下。Scala的容器类都是从Traversable和Iterable这两个trait开始的,然后分为三大类,分别是Seq,Set...

阿拉德大陆的魔法师
2016/04/01
353
1
第十章 Scala 容器基础(八):用ArrayBuffer作为你指定的可变序列

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

阿拉德大陆的魔法师
2016/04/10
774
0
零基础学习机器学习(Python语言、算法、Numpy库、MatplotLib)视频

机器学习作为人工智能的一部分,已经应用于很多领域,远超过人们的想象,垃圾邮件的过滤,在线广告的推荐系统,还有目前发展飞快的物体识别、人脸识别和语音识别的发展,都是机器学习的应用的...

qq_38472149
2018/05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
58
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
61
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
57
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部