第十章 Scala 容器基礎(二十七):元組

Problem

    你想要建立一個集合,集合元素類型是多樣的。es6

Solution

    元組爲你提供了一種方式來存儲不一樣類型的元素在一個容器內,這在許多狀況下是很是有用的。
spa

    新建一個元祖經過把須要的額元組包在一組小括號內。下面是一個二元祖:
scala

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

    注意,它包含了兩個不一樣的類型。下面這個例子展現了三元祖:
code

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

    你能夠使用下標來訪問元組元素:three

scala> t._1
res0: Int = 3

scala> t._2
res1: String = three

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

    我一般狀況下經過模式匹配來把元祖元素複製給一個變量:get

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

    這種解決方案還有一個很是美妙的好處在於,若是你不須要某一個元素,那麼你能夠使用_這個通配符來代替這個元素:it

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的實例。下面是建立二元祖最簡單的方式:io

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

    你還能夠使用下面的方式建立元組:table

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

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

    若是你查看他們的類型,你會發現他們都是Touple2:class

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)
相關文章
相關標籤/搜索