2011-11-26 16 views
5
rejestrowanie zdarzeń (Analytics) bibliotekę

Java ma metodę, która pobiera nazwę zdarzenia, a następnie varargs listę ciągów takiego:Spłaszczenie mapę do varargs listy String w Scala

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

zebrałem moją imprezę parametry do mapy jak

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

teraz nie musi być jakiś sposób, aby spłaszczyć Map do listy gdzie klucze i wartości zmieniają się, a następnie karmić go z metodą zdarzeń. Miałem kilka domysłów, jak przekształcenie Map do wykazu A List z Tuple s, ale nazywając .flatten na tym mówi

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

Co ja tu brakuje?

Odpowiedz

6

Można użyć operatora : _*:

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: _*) 

Nie jestem pewien, czy to działa z Java varargs również (daj nam znać!)

+0

Dziękujemy! Działa dokładnie tak, jak powinno. ToArray (lub toSeq) na końcu było potrzebne przed: _ *, aby uzyskać format wymagany przez java varargs. – vertti

6

Możesz użyć mapowania płaskiego, aby odwzorować każdą parę klucz/wartość na listę z dwoma elementami, a następnie połączyć te listy.

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) 

Kiedy już, że można po prostu przekazać listę metody zdarzenia:

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

Dzięki. res: _ * wytworzy Iterable, a Intellij powie mi, że tutaj jest wymagane 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

Trochę podobne do mojej odpowiedzi, ale 1 godzinę później i przy użyciu mapy i spłaszczania zamiast flatMap. Jaki jest sens? –

+0

Zapomniałem uderzyć wrócić. Ponieważ używa innej składni, zachowałem ją online. Powód do głosowania? –