我正在寻找一种方法将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中做一些更简单的方法,给出隐式转换和诸如此类的东西。任何人吗?
答案 0 :(得分:2)
基本上你想强制每个元素加到Seq
,然后立刻将它们展平。 Array
隐式转换为Seq
,Seq
和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代码,您可能需要考虑重构事情以摆脱首先使用Seq[Any]
)