在Scala中将元组转换为数组

时间:2019-02-15 02:08:54

标签: scala

在Scala中将元组转换为数组的最佳方法是什么?这里的“最佳”是指尽可能少的代码行。我震惊地搜索了Google和StackOverflow,却发现这个话题一无所获,这似乎应该是微不足道的和普遍的。列表具有toArray函数;为什么不元组?

1 个答案:

答案 0 :(得分:7)

使用productIterator,然后紧跟toArray

(42, 3.14, "hello", true).productIterator.toArray

给予:

res0: Array[Any] = Array(42, 3.14, hello, true)

结果的类型表明了它很少使用的主要原因:在元组中,元素的类型可以是异构的,在数组中,它们必须是同质的,因此在此转换期间通常会丢失太多的类型信息。如果要执行此操作,则可能首先不应该将信息存储在元组中。

Array[Any]几乎(安全)无能为力,除非将其打印出来或将其转换为更简陋的Set[Any]。相反,您可以使用:

  • 属于共同密封特征的案例类别列表,
  • 无形的HList,
  • 精心选择的具有继承性的基类,
  • 或至少在运行时保留某种模式的内容(例如Apache Spark数据集)

它们都是更好的选择。

在不太可能的情况下,您正在处理的“元组”的元素经常具有信息量最少的上限类型,那么它可能是,因为您没有工作具有简单的元组,但具有某种可遍历的数据结构,从而限制了节点中子结构的数量。在这种情况下,您应该考虑为结构实现类似Traverse的接口,而不是手动弄乱一些“元组”。