Scala - lambda参数可以匹配元组吗?

dvm*_*lls 48 scala

所以说我有一些像这样的清单

val l = List((1, "blue"), (5, "red"), (2, "green"))
Run Code Online (Sandbox Code Playgroud)

然后我想过滤其中一个,我可以做类似的事情

val m = l.filter(item => {
    val (n, s) = item          // "unpack" the tuple here
    n != 2
}
Run Code Online (Sandbox Code Playgroud)

有没有什么办法可以直接将元组"解包"作为lambda的参数,而不是拥有这个中间item变量?

像下面这样的东西是理想的,但是eclipse告诉我 wrong number of parameters; expected=1

val m = l.filter( (n, s) => n != 2 )
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激 - 使用2.9.0.1

Kip*_*ros 80

这是你能得到的最接近的:

 val m = l.filter { case (n, s) => n != 2 }
Run Code Online (Sandbox Code Playgroud)

它基本上是匿名PartialFunction中的模式匹配语法.对象和特征中也有tupled方法Function,但它们只是这个模式匹配表达式的包装器.

  • 您可以将`s`替换为`_`,因为它从未使用过. (8认同)

Ami*_*far 19

嗯,虽然基普顿有一个很好的答案.你可以通过这样做来缩短它.

val l = List((1, "blue"), (5, "red"), (2, "green"))
val m = l.filter(_._1 != 2)
Run Code Online (Sandbox Code Playgroud)

  • 更短不会使它变得更好.这对于非常简单的示例是有意义的,但对于更复杂的东西,Kipton的示例将导致更易读的代码. (5认同)

Rex*_*err 8

有很多选择:

for (x <- l; (n,s) = x if (n != 2)) yield x
l.collect{ case x @ (n,s) if (n != 2) => x }
l.filter{ case (n,s) => n != 2 }
l.unzip.zipped.map((n,s) => n != 2).zip   // Complains that zip is deprecated
Run Code Online (Sandbox Code Playgroud)


com*_*nad 7

val m = l.filter( (n, s) => n != 2 )
Run Code Online (Sandbox Code Playgroud)

...是一种类型不匹配,因为lambda定义了一个

  • Function2[String,Int,Boolean] 用两个参数代替
  • Function1[(String,Int),Boolean]以one Tuple2[String,Int]为参数.

您可以像这样在它们之间进行转换:

val m = l.filter( ((n, s) => n != 2).tupled )
Run Code Online (Sandbox Code Playgroud)