【问题标题】:Flattening a Map to varargs String list in Scala在Scala中将地图展平为可变参数字符串列表
【发布时间】:2012-01-07 00:36:30
【问题描述】:

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

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

我已将我的事件参数收集到一个类似的地图中

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

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

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

我在这里错过了什么?

【问题讨论】:

    标签: scala dictionary variadic-functions flatten


    【解决方案1】:

    您可以使用: _* 运算符:

    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 可变参数(让我们知道!)

    【讨论】:

    • 谢谢!完全按预期工作。在 :_* 之前需要最后的 toArray(或 toSeq)才能将其转换为 java varargs 所需的格式。
    【解决方案2】:

    您可以使用 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:_*)
    

    【讨论】:

    • 谢谢。 res:_* 将产生 Iterable 并且 Intellij 告诉我这里需要的是 Seq。
    【解决方案3】:
    val m = Map ("key1" -> "value1", "key2" -> "value2", "k3"-> "v3")
    val li = m.map ((e)=> List (e._1, e._2)).flatten.toSeq 
    event ("name", li: _*)
    

    【讨论】:

    • 与我的答案非常相似,但 1 小时后,使用 map 和 flatten 而不是 flatMap。有什么意义?
    • 我忘了按回车键。因为它使用不同的语法,所以我把它放在网上。投反对票的理由?
    猜你喜欢
    • 2020-08-10
    • 2020-07-06
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2021-09-05
    • 2017-09-02
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多