【问题标题】:Tuple Unpacking in Map Operations地图操作中的元组解包
【发布时间】:2011-10-17 19:49:24
【问题描述】:

我经常发现自己在使用元组的列表、序列和迭代器,并且想做类似以下的事情,

val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }

但是,编译器似乎从不同意这种语法。相反,我最终会写作,

arrayOfTuples.map { 
    t => 
    val e1 = t._1
    val e2 = t._2
    e1.toString + e2 
}

这很愚蠢。我该如何解决这个问题?

【问题讨论】:

    标签: scala map iterator tuples iterable-unpacking


    【解决方案1】:

    解决方法是使用case

    arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
    

    【讨论】:

    • 而且你甚至不需要输入元组元素。 case (e1, e2) => 已经足够好了,元组元素的类型是已知的。
    【解决方案2】:

    我喜欢元组函数;这既方便又重要,输入安全:

    import Function.tupled
    arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
    

    【讨论】:

      【解决方案3】:

      你为什么不使用

      arrayOfTuples.map {t => t._1.toString + t._2 }
      

      如果您多次需要参数,或者不同的顺序,或者在嵌套结构中,_ 不起作用,

      arrayOfTuples map {case (i, s) => i.toString + s} 
      

      似乎是一个简短但可读的形式。

      【讨论】:

      • 我猜主要原因是大多数时候map函数的处理远比_.toString + _复杂得多,他想操作比t._1t._2更易理解的名字.
      • 好吧,那么arrayOfTuples map {case (i, s) => i.toString + s} 当然更方便。但是,您应该提出您的问题,以获得您需要的答案。 :)
      • 好吧,正如他所说的“经常”,我希望这意味着“在不同的情况下”,我看不到任何需要Int + String 映射的场景。 ;)
      【解决方案4】:

      另一种选择是

      arrayOfTuples.map { 
          t => 
          val (e1,e2) = t
          e1.toString + e2
      }
      

      【讨论】:

        【解决方案5】:

        Scala 3开始,parameter untupling已经被扩展,允许这样的语法:

        // val tuples = List((1, "Two"), (3, "Four"))
        tuples.map(_.toString + _)
        // List[String] = List("1Two", "3Four")
        

        每个_ 指的是为了关联的元组部分。

        【讨论】:

          【解决方案6】:

          我认为for comprehension 是这里最自然的解决方案:

          for ((e1, e2) <- arrayOfTuples) yield {
            e1.toString + e2
          }
          

          【讨论】:

            猜你喜欢
            • 2018-01-18
            • 2023-02-25
            • 2021-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多