如何给'x._1._2`参数实际名称

时间:2014-02-21 20:56:40

标签: scala

有没有办法命名参数.map函数?请参阅Scala示例中的以下内容:

aggregated.map( (kv: ((String, Int, Int), (Int, Int))) =>("some stuff"))

我想将它们命名为

aggregated.map( (kv: ((name:String, score:Int, anInt:Int), (age:Int, count:Int))) =>("some stuff"))

这将使映射完成时更容易引用参数。例如,我可以说kv._1._2score而不是kv.score。使代码更易读,更容易调试。

2 个答案:

答案 0 :(得分:9)

使用“case”使用模式匹配从元组中提取变量:

aggregated.map { case((name, score, anInt), (age,count)) => ... }

您不需要指定类型注释,类型推断器会为您执行此操作:

    scala> List((("a",true,2),(1.0,2L)), (("b",false,11),(2.0,3L))).map { 
       case ((a,b,c),(d,e)) => s"$a$b$c$d$e" 
    }
    res3: List[String] = List(atrue21.02, bfalse112.03)

答案 1 :(得分:2)

通常的答案是使用匹配匿名函数的模式进行分解,正如另一个答案所说的那样,但这个问题也刚刚发生在我身上:

scala> List((("a",true,2),(1.0,2L)), (("b",false,11),(2.0,3L))).map { kv =>
     | import kv._1.{_1 => s}
     | s
     | }
res1: List[String] = List(a, b)

如果你没有提取所有字段,那么字节代码比模式匹配的字符数少。

scala> List((("a",true,2),(1.0,2L)), (("b",false,11),(2.0,3L))).map {
     | case ((s,_,_),_) => s
     | }
res2: List[String] = List(a, b)