2011-11-26 57 views
5

一個Java事件日誌(分析)庫有需要的事件名稱的方法,然後可變參數類似這樣的字符串列表:平展地圖可變參數字符串列表斯卡拉

Analytics.event("my event name", "key1", "value1", "key2", "value2" ...) 

我收集了我的事件在一個地圖參數,如

Map("key1" -> "value1", "key2" -> "value2" ...) 

現在必須有平坦化Map列出其中鍵和值替換,然後將其饋送到事件方法的一種方式。我有幾個猜測,像改造Map列出Tuple s的List,但調用.flatten上寫着

No implicit view available from (java.lang.String, java.lang.String) => scala.collection.TraversableOnce[B] 

缺少什麼我在這裏?

回答

6

可以使用: _*操作:

def event(name: String, values: String*) {/*...*/} 

val params = Map("key1" -> "value1", "key2" -> "value2") 
val paramsArr = params flatMap {case(k, v) => List(k, v)} toArray 

event("name", paramsArr: _*) 

不知道這是否可與Java可變參數(請告訴我們!)

+0

謝謝!完全按照設想工作。最後需要toArray(或toSeq):_ *以獲得java可變參數所需的格式。 – vertti

6

可以使用flatMap將每個鍵/值對映射到具有兩個元素的列表,然後連接這些列表。

scala> Map("k1" -> "v1", "k2" -> "v2") 
res0: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(k1 -> v1, k2 -> v2) 

scala> res0.flatMap { case (k,v) => k::v::Nil } 
res1: scala.collection.immutable.Iterable[java.lang.String] = List(k1, v1, k2, v2) 

一旦你的,你可以通過列表的事件方法:

Analytics.event("my event name", res1:_*) 
+0

謝謝。 res:_ *會產生Iterable,Intellij告訴我這是Seq。 – vertti

1
val m = Map ("key1" -> "value1", "key2" -> "value2", "k3"-> "v3") 
val li = m.map ((e)=> List (e._1, e._2)).flatten.toSeq 
event ("name", li: _*) 
+0

與我的答案非常相似,但1小時後,使用map和flatten代替flatMap。重點是什麼? –

+0

我忘了回去。由於它使用了不同的語法,我保持它在線。投票的理由是什麼? –

相關問題