13 scala tuples higher-order-functions
假设我有以下元组列表:
val tuples = listOfStrings.map(string => {
val split = string.split(":")
(split(0), split(1), split(2))
})
Run Code Online (Sandbox Code Playgroud)
我想在列表中得到split(0),在另一个列表中得到split(1),依此类推.这可以通过以下方式实现:
list1 = tuples.map(x => x._1).toList
list2 = tuples.map(x => x._2).toList
list3 = tuples.map(x => x._3).toList
Run Code Online (Sandbox Code Playgroud)
是否有更优雅(功能)的方式来实现上述内容而无需编写3个单独的语句?
Rég*_*les 12
这会将您的结果作为列表列表提供给您:
tuples.map{t => List(t._1, t._2, t._3)}.transpose
Run Code Online (Sandbox Code Playgroud)
如果要将它们存储在局部变量中,只需执行以下操作:
val List(l1,l2,l3) = tuples.map{t => List(t._1, t._2, t._3)}.transpose
Run Code Online (Sandbox Code Playgroud)
更新:正如Blaisorblade指出的那样,标准库实际上有一个内置的方法:unzip3这就像unzip三元组而不是对:
val (l1, l2, l3) = tuples.unzip3
Run Code Online (Sandbox Code Playgroud)
不用说,你应该赞成这种方法而不是上面的手动解决方案(但是对于arity> 3的元组,这仍然适用).
小智 10
你想要解压缩:
scala> val (numbers, homonyms) = List(("one", "won"), ("two", "too")).unzip
numbers: List[java.lang.String] = List(one, two)
homonyms: List[java.lang.String] = List(won, too)
Run Code Online (Sandbox Code Playgroud)