85

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

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 
}

这很愚蠢。我怎样才能解决这个问题?

4

6 回答 6

143

一种解决方法是使用case

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
于 2011-08-01T22:26:10.023 回答
33

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

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
于 2011-08-02T10:32:28.900 回答
18

你为什么不使用

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

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

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

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

于 2011-08-02T06:03:56.463 回答
8

另一种选择是

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}
于 2011-08-01T22:39:11.647 回答
4

从 开始Scala 3参数 untupling得到了扩展,允许使用这样的语法:

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

其中 each_指的是关联的元组部分。

于 2019-05-21T20:10:45.990 回答
2

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

for ((e1, e2) <- arrayOfTuples) yield {
  e1.toString + e2
}
于 2019-11-20T08:20:56.597 回答