2017-06-22 63 views
1

元组循环在斯卡拉我如何通过阶

val captainStuff = ("One", "Two", "Three", "Four", "Five") 

如何我可以循环遍历一个元组?在列表和地图上循环很容易。但是如何通过Tuple循环。

谢谢!

+4

元组可以迭代(请参阅'productIterator'),但它是一个_bad_想法。由于所有元素都变成了“Any”类型,因此您会丢失类型安全性。 – jwvh

+3

如果你发现自己需要“循环”一个元组,那么你可能应该考虑其他数据结构,就像一个序列。 – maasg

回答

2

你可以将它转换为迭代器,如:

val captainStuff = ("One", "Two", "Three", "Four", "Five") 

captainStuff.productIterator.foreach(x => { 
    println(x) 
}) 

这个问题是一个重复的BTW:

Scala: How to convert tuple elements to lists

+0

谢谢帕维尔! –

+0

我假设你接受这个答案,所以随时标记为接受:)谢谢 – Pavel

0

如何我可以循环遍历?在列表和地图上循环很容易。但是如何通过Tuple循环。

列表和地图是集合。元组不是。迭代(又名“循环”)真的只对那些元组没有的集合有意义。

元组是产品类型。它们是将不同类型的多个值组合成单个结构的一种方式。考虑到元组的字段可能有不同的类型,你会如何迭代它呢?元素变量的类型是什么?

如果您熟悉其他语言,你可能熟悉的记录(如帕斯卡RECORDstruct在C)的概念。元组有点像他们,除了字段没有名字。如何迭代Pascal中的记录或C中的结构?你不这样做没有意义。

实际上,您可以将对象作为记录。再一次,你如何迭代对象的字段?你不这样做没有意义。

注1:是的,有时候,它意义的,在一个对象的字段重复IFF你正在做的反射元编程。

注2:在Scala中,元组Product继承,它具有非类型安全productIterator方法,给你一个Iterator[Any],它允许您遍历一个元组,但没有类型安全。只是不要这样做。

tl; dr:元组不是集合。你只是不要遍历它们。期。如果你认为你必须这样做,那么你做错了什么,即你不应该有一个元组,但可能是一个数组或列表。

+0

嗨JörgW Mittag,谢谢你的好解释。我曾在SQL,ETL工作,但我是新编程。 –

+0

那么,如果你知道SQL,那么你应该设置:SQL是关于(集合)元组的。你“迭代”(实际上,你没有,数据库为你做)超过集(行),但从来没有超过元组。 –

+0

是的,这是正确的。 –