Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中变换贴图_Scala_Anonymous Function_Scala Collections - Fatal编程技术网

在Scala中变换贴图

在Scala中变换贴图,scala,anonymous-function,scala-collections,Scala,Anonymous Function,Scala Collections,我想在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)) 到 我使用[这个答案][1]实现了我的目标: scala> val schema

我想在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))

我使用[这个答案][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))}
scala>schema展平{case(k,vs)=>vs.map((k.concat(“:”).concat(u),k))}
:13:错误:类型不匹配;
找到:(String=>String,String)
必需:字符串=>?
模式展平{case(k,vs)=>vs.map((k.concat(“:”).concat(u),k))}
  • (k.concat(“:”).concat(k),k)
    中没有
    ,也没有变量,因此它不是一个函数文本,但是
    映射的参数必须是一个函数
  • 无论如何,您都不想将
    k
    k
    连接起来
  • 试试这个:

    schema.flatMap { case (k, vs) => vs.map(v => (k + ":" + v, k)) }
    
    或者更简洁地说:

    for ((k, vs) <- schema; v <- vs) yield (k + ":" + v, k)
    
    用于((k,vs)字符串,字符串)
    。这与
    String=>(String,String)
    不同,这仍然不是您想要的

  • (k.concat(“:”).concat(k),k)
    中没有
    ,也没有变量,因此它不是一个函数文本,但是
    映射的参数必须是一个函数
  • 无论如何,您都不想将
    k
    k
    连接起来
  • 试试这个:

    schema.flatMap { case (k, vs) => vs.map(v => (k + ":" + v, k)) }
    
    或者更简洁地说:

    for ((k, vs) <- schema; v <- vs) yield (k + ":" + v, k)
    

    用于((k,vs)字符串,字符串)
    。这与
    String=>(String,String)
    不同,这仍然不是您想要的。

    错误消息告诉您,
    .map
    采用
    String=>?
    形式的函数,但您正在传递一个
    (String,String)
    的元组

    (k.concat(“:”)。concat(k),k)
    不是一个函数-而且我认为你不是有意在
    concat
    中放置
    k
    两次

    要创建映射,您需要一个带有签名的函数
    String=>(String,String)

    • vs.map((k.concat(“:”).concat(k,k))
      错误地将
      (String,String)
      传递到map
    • vs.map((k.concat(“:”).concat(u),k))
      错误地将
      (String=>String,String)
      传递到map
    • vs.map(v=>(k.concat(“:”).concat(v,k))
      正确匹配
      String=>(String,String)
    我们可以得到:

    schema flatten {case(k, vs) => vs.map(v => (k.concat(":").concat(v), k)) }
     //  List((A:a1,A), (A:a2,A), (B:b1,B)) 
    
    您可以看到此代码正在运行

    然而,正如Andrey出色的评论所指出的,使用带有隐式函数的
    flatten
    并不是一个好的实践。此外,您需要的是
    映射
    ,而不是
    列表
    。出于这两个原因,我认为您应该使用
    flatMap
    而不是
    flatte

    schema flatMap {case(k, vs) => vs.map(v => (k.concat(":").concat(v), k)) };
    // Map(A:a1 -> A, A:a2 -> A, B:b1 -> B)
    

    查看是否要尝试。

    错误消息告诉您,
    .map
    采用
    String=>?
    形式的函数,但您正在向它传递一个
    (String,String)
    元组

    (k.concat(“:”)。concat(k),k)
    不是一个函数-而且我认为你不是有意在
    concat
    中放置
    k
    两次

    要创建映射,您需要一个带有签名的函数
    String=>(String,String)

    • vs.map((k.concat(“:”).concat(k,k))
      错误地将
      (String,String)
      传递到map
    • vs.map((k.concat(“:”).concat(u),k))
      错误地将
      (String=>String,String)
      传递到map
    • vs.map(v=>(k.concat(“:”).concat(v,k))
      正确匹配
      String=>(String,String)
    我们可以得到:

    schema flatten {case(k, vs) => vs.map(v => (k.concat(":").concat(v), k)) }
     //  List((A:a1,A), (A:a2,A), (B:b1,B)) 
    
    您可以看到此代码正在运行

    然而,正如Andrey出色的评论所指出的,使用带有隐式函数的
    flatten
    并不是一个好的实践。此外,您需要的是
    映射
    ,而不是
    列表
    。出于这两个原因,我认为您应该使用
    flatMap
    而不是
    flatte

    schema flatMap {case(k, vs) => vs.map(v => (k.concat(":").concat(v), k)) };
    // Map(A:a1 -> A, A:a2 -> A, B:b1 -> B)
    

    看看你是否想试试。

    展平
    ?什么时候开始有人用
    flatten
    代替
    flatMap
    ?@TimothyJones
    flatten
    没有什么错。但是滥用隐式函数参数使其表现得像一个
    flatMap
    是非常丑陋的。应该记住,对于某些
    B
    ,这个隐式函数参数的存在只是为了通过将类型参数
    A
    转换为
    Iterable[B]
    使类型检查器满意。在没有隐式转换函数就可以表达此约束的严格类型化编程语言中,或者在非类型化语言中,
    flatte
    甚至不接受任何参数<代码>展平
    应实现基本的一元“乘法”。不用担心,谢谢!我还注意到,在这种情况下,它会导致错误的返回类型。
    flatte
    ?什么时候开始有人用
    flatten
    代替
    flatMap
    ?@TimothyJones
    flatten
    没有什么错。但是滥用隐式函数参数使其表现得像一个
    flatMap
    是非常丑陋的。应该记住,对于某些
    B
    ,这个隐式函数参数的存在只是为了通过将类型参数
    A
    转换为
    Iterable[B]
    使类型检查器满意。在没有隐式转换函数就可以表达此约束的严格类型化编程语言中,或者在非类型化语言中,
    flatte
    甚至不接受任何参数<代码>展平
    应实现基本的一元“乘法”。不用担心,谢谢!我还注意到,在这种情况下,它会导致错误的返回类型。谢谢。我确实在我的帖子中犯了一个错误,我在回复你的答案时纠正了这个错误。当我切换到
    (k.concat(“:”)。concat(uu),k)
    时,我仍然会遇到一个错误,尽管是另一个错误。Andrey,非常感谢您的帮助