2012-07-05 46 views
1

我正在尋找一種方法來處理一個任何數組或序列,並在可能的情況下迭代它。Scala:如何處理任何像Array或Seq?

目前我有一些代碼,看起來像這樣,採取Any的序列,並展平包含任何Traversable或Array對象。

​​

感覺就像mustr是一個簡單的方法在Scala中完成這項工作,給定了隱式轉換和什麼。任何人?

回答

2

基本上你想強制每個元素到Seq,然後將它們一次全部壓扁。 Array具有隱式轉換爲Seq,並且SeqTraversable都具有.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]的)

+4

或者等價地: 'as.flatMap {...} .map(_。toString)'。 – 2012-07-05 17:58:44

+0

更清潔,謝謝。我真正想要的是一種將Traversable和Array案例合併爲一個的方法。看起來像陣列到Seq的隱式轉換應該允許你以某種方式做到這一點。 – 2012-07-05 18:37:58

+0

我同意Seq [Any]不理想。這一切都源於Play 2的WS框架,它將查詢參數表示爲Map [String,String]。隨後我想支持多值參數,所以我的代碼實際上有一個Map [String,Any]。 – 2012-07-05 19:10:15