2

如果可能,我正在寻找一种将 Any 视为 Array 或 Seq 并对其进行迭代的方法。

目前我有一些看起来像这样的代码,采用一系列 Any 并展平包含的任何 Traversable 或 Array 对象。

def flattenAsStrings(as: Seq[Any]): Seq[String] = {
  val (travValued, other) = as.partition(a => classOf[Traversable[_]] isAssignableFrom(a.getClass))
  val (arrayValued, singleValued) = other.partition(a => a.isInstanceOf[Array[_]])
  val travStrings = travValued.map(_.asInstanceOf[Traversable[_]].map(_.toString)).flatMap(_.toList)
  val arrayStrings = arrayValued.map(_.asInstanceOf[Array[_]].map(_.toString)).flatMap(_.toList)
  singleValued.map(_.toString) ++ travStrings ++ arrayStrings
} 

考虑到隐式转换等等,感觉在 Scala 中必须有一种更简单的方法来做到这一点。任何人?

4

1 回答 1

2

基本上,您想将每个元素强制为 a Seq,然后一次将它们全部展平。 Array隐式转换为SeqandSeq并且Traversable有一个.toSeq方法。所以我们可以这样做:

val t: Traversable[Int] = List(1, 2, 3)
val a: Array[Int] = Array(4, 5, 6)
val other = "whatever"
val as: Seq[Any] = List(t, a, other)

as.flatMap{
  case t: Traversable[_] => t.toSeq
  case a: Array[_] => a.toSeq
  case other => Seq(other)
}.map{_.toString}
//Seq[java.lang.String] = List(1, 2, 3, 4, 5, 6, whatever)

(顺便说一句,这是非常丑陋的 Scala 代码,您可能需要考虑重构一些东西以首先摆脱使用 a Seq[Any]

于 2012-07-05T17:53:48.100 回答