Scala:如何处理像阵列或Seq一样的Any?

时间:2012-07-05 17:33:41

标签: scala

我正在寻找一种方法将Any视为数组或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中做一些更简单的方法,给出隐式转换和诸如此类的东西。任何人吗?

1 个答案:

答案 0 :(得分:2)

基本上你想强制每个元素加到Seq,然后立刻将它们展平。 Array隐式转换为SeqSeqTraversable都有.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代码,您可能需要考虑重构事情以摆脱首先使用Seq[Any]