地图操作中的元组拆箱


78

我经常发现自己正在使用元组的列表,序列和迭代器,并且希望执行以下操作,

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 
}

真是愚蠢。我该如何解决?

Answers:


133

解决方法是使用case

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

36
而且,您甚至不需要键入元组元素。case(e1,e2)=>足够好,已知元组元素的类型。
Didier Dupont

31

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

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
我想主要的原因是,大部分的时间,地图功能的处理远远不止复杂_.toString + _,他想操纵比更易于理解的名称t._1t._2
尼古拉斯·

好吧,那arrayOfTuples map {case (i, s) => i.toString + s}当然更方便了。但是,您应该问自己的问题,以获得所需的答案。:)
未知用户

好吧,正如他“经常”说的那样,我希望这意味着“在不同情况下”,我看不到您经常需要Int + String映射的任何情况。;)
Nicolas


2

请注意,使用Dotty(的基础Scala 3),已扩展了参数取消关联,从而允许使用以下语法:

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

其中每个_都是为了引用相关的元组部分。


0

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

for ((e1, e2) <- arrayOfTuples) yield {
  e1.toString + e2
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.