假设我们有两个序列,我们希望使用某种方法将它们组合起来
val a = Vector(1,2,3)
val b = Vector(4,5,6)
例如,添加可以是
val c = a zip b map { i => i._1 + i._2 }
或
val c = a zip b map { case (i, j) => i + j }
第二部分的重复让我觉得这应该可以在一次操作中完成。我看不到任何内置的方法。我想我真正想要的是一种跳过元组创建和提取的zip方法。
Scala中是否有更漂亮/更简洁的方式,或者Scalaz?如果没有,你会如何编写这样的方法并将其移植到序列上,这样我就可以编写类似
的内容val c = a zipmap b (_+_)
答案 0 :(得分:12)
有
(a,b).zipped.map(_ + _)
这可能足够接近您想要不打扰扩展的内容。 (不幸的是,你不能无点使用它,因为zipped
上的暗示不喜欢它。)
答案 1 :(得分:2)
Rex的answer肯定是大多数案例的更简单方法。但是,zipped
比zip
更受限制,因此您可能会遇到不起作用的情况。
对于这些情况,您可以尝试这样做:
val c = a zip b map (Function tupled (_+_))
或者,或者,如果你有一个功能或方法可以做你想要的,你也有这个选项:
def sumFunction = (a: Int, b: Int) => a + b
def sumMethod(a: Int, b: Int) = a + b
val c1 = a zip b map sumFunction.tupled
val c2 = a zip b map (sumMethod _).tupled
使用.tupled
在第一种情况下不起作用,因为Scala无法推断出函数的类型。