在Scala中将元组转换为数组

uba*_*dub 2 scala

在Scala中将元组转换为数组的最佳方法是什么?这里"最好"意味着尽可能少的代码行.我很震惊地搜索谷歌和StackOverflow只是为了找不到这个主题,这似乎应该是微不足道和常见的.列表有一个toArray功能; 为什么不元组?

And*_*kin 7

使用productIterator,紧接着是toArray:

(42, 3.14, "hello", true).productIterator.toArray
Run Code Online (Sandbox Code Playgroud)

得到:

res0: Array[Any] = Array(42, 3.14, hello, true)
Run Code Online (Sandbox Code Playgroud)

结果的类型显示了它很少使用的主要原因:在元组中,元素的类型可以是异构的,在数组中它们必须是同构的,因此在转换期间通常会丢失太多的类型信息.如果你想这样做,那么你可能不应该首先将你的信息存储在元组中.

Array[Any]除了将其打印出来或将其转换为更加简洁之外,几乎没有任何东西可以(安全地)使用Set[Any].相反,你可以使用:

  • 属于共同密封特征的案例类别列表,
  • 无形的HLists,
  • 精心挑选的基类,带有一点继承,
  • 或者至少在运行时保留某种模式的东西(比如Apache Spark Datasets)

他们都是更好的选择.

在一个不太可能的情况下,你经常处理的"元组"的元素经常变成信息最少的上限类型,那么可能是因为你没有使用普通元组,但是有某种可遍历的限制节点中子结构数量的数据结构.在这种情况下,你应该考虑Traverse为结构实现类似接口的东西,而不是手动搞乱一些"元组".