2

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でこれを行うためのより簡単な方法があるはずだと感じています。誰?

4

1 に答える 1

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)

Seq[Any](余談ですが、これはかなり醜いScalaコードです。そもそも、を使用しないようにリファクタリングを検討することをお勧めします)

于 2012-07-05T17:53:48.100 に答える