在Scala中方便地编写元组的功能

Ale*_*nov 26 scala scala-2.8

相当多Map的函数在一个键值元组上作为参数.例如def foreach(f: ((A, B)) ? Unit): Unit.所以我找了一个简短的方法来写一个参数foreach:

> val map = Map(1 -> 2, 3 -> 4)

map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)

> map.foreach((k, v) => println(k))

error: wrong number of parameters; expected = 1
       map.foreach((k, v) => println(k))
                          ^

> map.foreach({(k, v) => println(k)})

error: wrong number of parameters; expected = 1
       map.foreach({(k, v) => println(k)})
                           ^

> map.foreach(case (k, v) => println(k))

error: illegal start of simple expression
       map.foreach(case (k, v) => println(k))
                   ^
Run Code Online (Sandbox Code Playgroud)

我可以

> map.foreach(_ match {case (k, v) => println(k)})

1
3
Run Code Online (Sandbox Code Playgroud)

有更好的选择吗?

Ben*_*ngs 46

你非常接近map.foreach(case (k, v) => println(k)).要case在匿名函数中使用,请用大括号括起来.

map foreach { case (k, v) => println(k) }
Run Code Online (Sandbox Code Playgroud)


mkn*_*ssl 13

在这种情况下,我经常使用for语法.

for ((k,v) <- map) println(k)
Run Code Online (Sandbox Code Playgroud)

根据"Scala编程"中的第23章,上面的for循环被转换为call foreach.


RoT*_*oRa 5

一种替代tupled方法是Function对象的方法:

import Function.tupled;
// map tupled foreach {(k, v) => println(k)}
map foreach tupled {(k, v) => println(k)}
Run Code Online (Sandbox Code Playgroud)

  • @Rahul`map foreach Function.tupled((k,v)=> println(k))`或`map foreach((k:Int,v:Int)=> println(k)).tupled` does. (2认同)