val list = List((1,2), (3,4))
list.map(tuple => {
val (a, b) = tuple
do_something(a,b)
})
// the previous can be shortened as follows
list.map{ case(a, b) =>
do_something(a,b)
}
// similarly, how can I shorten this (and avoid declaring the 'tuple' variable)?
def f(tuple: (Int, Int)) {
val (a, b) = tuple
do_something(a,b)
}
// here there two ways, but still not very short,
// and I could avoid declaring the 'tuple' variable
def f(tuple: (Int, Int)) {
tuple match {
case (a, b) => do_something(a,b)
}
}
def f(tuple: (Int, Int)): Unit = tuple match {
case (a, b) => do_something(a,b)
}
答案 0 :(得分:2)
使用tupled
scala> def doSomething = (a: Int, b: Int) => a + b
doSomething: (Int, Int) => Int
scala> doSomething.tupled((1, 2))
res0: Int = 3
scala> def f(tuple: (Int, Int)) = doSomething.tupled(tuple)
f: (tuple: (Int, Int))Int
scala> f((1,2))
res1: Int = 3
scala> f(1,2) // this is due to scala auto-tupling
res2: Int = 3
tupled
是为FunctionN
的每个N >= 2
定义的,并返回一个期望包含在元组中的参数的函数。
答案 1 :(得分:0)
虽然这可能看起来像一个微不足道的建议,但只需在元组上使用f
和_1
即可进一步简化_2
函数。
def f(tuple: (Int, Int)): Unit =
do_something(tuple._1, tuple._2)
显然,这样做会影响可读性(有关元组第1和第2个参数意义的一些元信息被删除),你是否希望在{{{}的其他地方使用元组的元素? 1}}方法,您需要再次提取它们。
虽然对于许多用途而言,这可能仍然是最简单,最短和最直观的选择。
答案 2 :(得分:0)
如果我理解正确,你试图将一个元组传递给一个带有2个args的方法?
def f(tuple: (Int,Int)) = do_something(tuple._1, tuple._2)
答案 3 :(得分:0)
更易读,我的意思是给出变量名而不是在元组上使用_1和_2
在这种情况下,使用case类而不是元组是个好主意,特别是因为它只需要一行:
case class IntPair(a: Int, b: Int)
def f(pair: IntPair) = do_something(pair.a, pair.b)
如果从无法更改的外部代码中获取(Int, Int)
(或者您不想更改),则可以添加从元组转换为IntPair
的方法。
另一种选择:{(a: Int, b: Int) => a + b}.tupled.apply(tuple)
。不幸的是,{case (a: Int, b: Int) => a + b}.apply(tuple)
不起作用。