【发布时间】:2026-02-07 01:45:01
【问题描述】:
我想在 Scala 中转换 String -> List[String] 类型的映射,使得每个 (k, (List v1, v2, ... vn)) 键值对都指向 {(k:v1, k), (k:v2, k), ... (k:vn, k)} 对。
比如我想改造
scala.collection.immutable.Map[String,List[String]] = Map(A -> List(a1, a2), B -> List(b1))
到
scala.collection.immutable.Map[String,List[String]] = Map(A:a1 -> A, A:a2 -> A, B:b1 -> B)
我能够使用 [this answer][1] 实现我的目标:
scala> val schema = Map("A" -> List("a1", "a2"), "B" -> List("b1"))
schema: scala.collection.immutable.Map[String,List[String]] = Map(A -> List(a1, a2), B -> List(b1))
scala> schema flatten {case(k, vs) => vs.map((_, k))}
res1: scala.collection.immutable.Iterable[(String, String)] = List((a1,A), (a2,A), (b1,B))
当我尝试在每个值前面加上原始键和冒号时,我得到一个错误:
scala> schema flatten {case(k, vs) => vs.map((k.concat(":").concat(_), k))}
<console>:13: error: type mismatch;
found : (String => String, String)
required: String => ?
schema flatten {case(k, vs) => vs.map((k.concat(":").concat(_), k))}
【问题讨论】:
-
flatten?从什么时候开始有人使用flatten而不是flatMap? -
@TimothyJones
flatten没有任何问题。但是滥用隐式函数参数使其表现得好像flatMap真的很丑陋。应该记住,这个隐式函数参数的存在只是为了通过将类型参数A转换为Iterable[B]对于某些B来使类型检查器满意。在无需隐式转换函数即可表达此约束的严格类型编程语言中,或在无类型语言中,flatten甚至根本不接受任何参数。flatten应该实现基本的单子“乘法”。它不需要任何参数。 -
谢谢!我还注意到在这种情况下它会导致错误的返回类型。
标签: scala anonymous-function scala-collections