将地图展平为valargs Scala中的字符串列表

ver*_*tti 5 dictionary scala variadic-functions flatten

Java事件日志记录(分析)库有一个方法,它接受事件名称,然后是字符串的varargs列表,如下所示:

Analytics.event("my event name", "key1", "value1", "key2", "value2" ...)
Run Code Online (Sandbox Code Playgroud)

我已将我的事件参数收集到Map中

Map("key1" -> "value1", "key2" -> "value2" ...)
Run Code Online (Sandbox Code Playgroud)

现在必须有一种方法来展平Map键和值交替的列表,然后将其提供给事件方法.我已经进行了几次猜测,比如转换Map为列出ListTuples,但是调用.flatten就可以了

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

我在这里错过了什么?

Kim*_*bel 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)
Run Code Online (Sandbox Code Playgroud)

完成后,您可以将列表传递给事件方法:

Analytics.event("my event name", res1:_*)
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 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: _*)
Run Code Online (Sandbox Code Playgroud)

不确定这是否适用于Java varargs(让我们知道!)