5

Java 事件日志(分析)库有一个方法,该方法接受事件名称和字符串的可变参数列表,如下所示:

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

我已经将我的事件参数收集到一个像这样的地图中

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

现在必须有一种方法来展平Map键和值交替的列表,然后将其提供给事件方法。我有几个猜测,比如将 转换为s 的Map列表,但调用 .flatten 表示ListTuple

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

我在这里想念什么?

4

3 回答 3

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:_*)
于 2011-11-26T19:05:58.080 回答
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 可变参数(让我们知道!)

于 2011-11-26T19:06:45.193 回答
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: _*)
于 2011-11-26T20:13:18.883 回答