scala中的tuple元组

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: (StringString) = (AL,Alabama)

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

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

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

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

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

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

scala> c.getClass
res8: Class[_ <: (StringString)] = 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: (StringString) = (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: (StringString) = (AL,Alabama)

scala> t.productIterator.toVector
res13: Vector[Any] = Vector(AL, Alabama)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Soyoger

听说打赏的都进了福布斯排行榜。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值