我很困惑如何编写映射两个列表的map函数:
例如:
def map[A,B,C](f: (A, B) => C, lst1: List[A], lst2: List[B]): List[C]
输入将是2个列表,输出可以是添加整数的列表
测试示例:
assert(map(add, List(1, 2, 3), List(4, 5, 6)) == List(5, 7, 9))
答案 0 :(得分:5)
您可以使用security.oauth2.resource.userInfoUri
将f.tupled
从接受参数f
的函数转换为将一个参数作为元组(A, B) => C
接受的函数。然后,您可以((A, B)) => C
将这些列表放在一起(将它们作为一个元组列表)并使用传统的zip
将其提供给f
。
map
请注意,如果两个列表的大小不同,则def map[A,B,C](f: (A, B) => C, lst1: List[A], lst2: List[B]): List[C] =
(lst1 zip lst2) map f.tupled
scala> def add(a: Int, b: Int): Int = a + b
add: (a: Int, b: Int)Int
scala> map(add, List(1, 2, 3), List(4, 5, 6))
res20: List[Int] = List(5, 7, 9)
会截断较长的列表以匹配较小的列表。
答案 1 :(得分:1)
如m-z的答案中所述,您可以压缩列表,然后映射元组列表。如果您想避免使用tupled
,您可以明确地进行解构:
def map[A,B,C](f: (A, B) => C, lst1: List[A], lst2: List[B]): List[C] = {
val zipped = lst1 zip lst2
zipped.map { case (a,b) => f(a,b) }
}