在Map操作中进行元组解包

90

我经常处理元组列表、序列和迭代器,在此我想执行以下操作:

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 
}

这太荒谬了。我该怎么解决这个问题?
6个回答

153

可以使用 case 作为解决方法:

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

40
你甚至不需要输入元组的元素。case (e1, e2) =>已经足够好了,元组元素的类型已知。 - Didier Dupont

33

我喜欢tupled函数;它既方便又最重要的是类型安全:

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

18

为什么不使用

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

如果您需要多次使用参数,或以不同顺序,或在嵌套结构中使用,其中下划线无法起作用,请使用:
arrayOfTuples map {case (i, s) => i.toString + s} 

似乎是一个简短但易于阅读的表单。

1
我猜主要原因是大多数情况下,map函数的处理比_.toString + _复杂得多,他想使用更易理解的名称而不是t._1t._2 - Nicolas
那么 arrayOfTuples map {case (i, s) => i.toString + s} 当然更方便。不过,你应该问出你所拥有的问题,以获得你需要的答案。 :) - user unknown
嗯,正如他所说的“频繁”,我希望这意味着“在不同情况下”,我并没有看到你经常需要一个Int + String映射的场景。;) - Nicolas

8
另一个选择是:
arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}

6

Scala 3 开始,参数展开 已被扩展,允许使用以下语法:

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

每个_按顺序引用相应的元组部分。


2

我认为使用for推导式是最自然的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接