元组在地图操作中解包

duc*_*thd 72 iterator scala tuples map iterable-unpacking

我经常发现自己与元组的列表,序列和迭代器一起工作,并希望做类似以下的事情,

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

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

arrayOfTuples.map { 
    t => 
    val e1 = t._1
    val e2 = t._2
    e1.toString + e2 
}
Run Code Online (Sandbox Code Playgroud)

这真是太傻了.我怎么能绕过这个?

Nic*_*las 124

解决方法是使用case:

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
Run Code Online (Sandbox Code Playgroud)

  • 而且你甚至不需要输入元组元素.case(e1,e2)=>足够好,元组元素的类型是已知的. (34认同)

tho*_*dge 29

我喜欢tupled函数; 它既方便又简单,类型安全:

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
Run Code Online (Sandbox Code Playgroud)


use*_*own 16

你为什么不用

arrayOfTuples.map {t => t._1.toString + t._2 }
Run Code Online (Sandbox Code Playgroud)

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

arrayOfTuples map {case (i, s) => i.toString + s} 
Run Code Online (Sandbox Code Playgroud)

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


Kim*_*bel 7

另一种选择是

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 6

从 开始Scala 3参数解组已得到扩展,允许这样的语法:

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

其中每个_按顺序引用关联的元组部分。