2011-11-26 16 views
5
biblioteca (análisis)

de Java tiene un método que toma un nombre de evento y luego lista de cadenas como éste varargs:aplanamiento ubicación en el Mapa varargs lista de cadenas en el registro de eventos Scala

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

He recogido mi evento parámetros de un mapa como

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

Ahora debe haber una manera de aplanar la Map a la lista donde las claves y valores alternativos y luego alimentar al método de evento. He tenido varias conjeturas, como la transformación de la Map a la lista de un ListTuple s, pero llamar .flatten en la que dice

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

Qué me estoy perdiendo aquí?

Respuesta

6

Puede utilizar el : _* operador:

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

No estoy seguro de si esto funciona con Java varargs también (¡háganos saber!)

+0

¡Gracias! Funciona exactamente como se supone. El toArray (o toSeq) al final fue necesario antes de: _ * para obtener el formato requerido por los varargs de Java. – vertti

6

Puede usar flatMap para asignar cada par de clave/valor a una lista con dos elementos y luego concatenar estas listas.

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) 

Una vez que usted tiene que, sólo puede pasar a la lista para el método de evento:

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

Gracias. res: _ * producirá Iterable e Intellij me dice que es Seq lo que se requiere aquí. – 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

Bastante similar a mi respuesta, pero 1 hora más tarde y utilizando el mapa y aplanar en lugar de flatMap. ¿Cuál es el punto de? –

+0

Olvidé presionar regresar. Como usa una sintaxis diferente, la mantuve en línea. ¿Una razón para votarlo? –

Cuestiones relacionadas