用于理解2参数映射函数

时间:2012-05-29 17:19:11

标签: scala for-loop

我尝试使用zipped方法来元组来浏览临时压缩列表

给它类似的东西:

val l1 : List[Int] = List(1,2,3)
val l2 : List[Int] = List(2,3,1)
val l3 : List[Int] = for ( (a,b) <- (l1,l2).zipped ) yield a+b

这是一个合成示例,可能只用map函数替换,但我想在更复杂的表达式中使用它。

它给了我错误:错误的参数数量; expected = 2 这是有意义的,因为(l1,l2).zipped.map有两个参数。将两个参数的映射函数转换为理解的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

scala> val l1 : List[Int] = List(1,2,3)
l1: List[Int] = List(1, 2, 3)

scala> val l2 : List[Int] = List(2,3,1)
l2: List[Int] = List(2, 3, 1)

scala> val l3 : List[Int] = for ( (a,b) <- (l1,l2).zip) yield a+b    
l3: List[Int] = List(3, 5, 4)

答案 1 :(得分:1)

您无法将压缩版本转换为for语句,因为for只是

(l1,l2).zipped.map{ _ match { case (a,b) => a+b } }

zipped的地图需要两个参数,而不是一个。因为不知道有两个参数的地图,但它确实知道如何进行匹配。元组正是将两个参数转换为一个所需的,而zip将为您创建它们:

for ((a,b) <- (l1 zip l2)) yield a+b

以每次迭代创建额外对象为代价。在许多情况下,这无关紧要;当它发生时,你最好完全写出来。实际上,你可能更好地使用Array,至少如果原语很重要,那么你可以避免装箱,并且可以使用索引。