Выравнивание карты в список строк varargs в Scala - PullRequest
5 голосов
/ 26 ноября 2011

В библиотеке журнала событий Java (аналитика) есть метод, который принимает имя события, а затем список строк Varargs, например:

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

Я собрал параметры своего события на карту, как

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

Теперь должен быть способ сгладить Map, чтобы указать, где чередуются ключи и значения, и затем передать его методу события. У меня было несколько догадок, например, преобразование Map в список List из Tuple s, но вызов .flatten для этого говорит

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

Что мне здесь не хватает?

Ответы [ 3 ]

6 голосов
/ 26 ноября 2011

Вы можете использовать оператор : _*:

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 varargs (дайте нам знать!)

6 голосов
/ 26 ноября 2011

Вы можете использовать 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:_*)
1 голос
/ 27 ноября 2011
val m = Map ("key1" -> "value1", "key2" -> "value2", "k3"-> "v3")
val li = m.map ((e)=> List (e._1, e._2)).flatten.toSeq 
event ("name", li: _*)
...