user908853
user908853

Reputation:

Use map elements as method arguments

I've been stuck on this for a while now: I have this method

Method(a: (A,B)*): Unit

and I have a map of type Map[A,B], is there a way to convert this map so that I can directly use it as an argument? Something like:

Method(map.convert)

Thank you.

Upvotes: 3

Views: 197

Answers (3)

Philippe
Philippe

Reputation: 9742

You can build a sequence of pairs from a Map by using .toSeq.

You can also pass a sequence of type Seq[T] as varargs by "casting" it with : _*.

Chain the conversions to achieve what you want:

scala> val m = Map('a' -> 1, 'b' -> 2, 'z' -> 26)
m: scala.collection.immutable.Map[Char,Int] = Map(a -> 1, b -> 2, z -> 26)

scala> def foo[A,B](pairs : (A,B)*) = pairs.foreach(println)
foo: [A, B](pairs: (A, B)*)Unit

scala> foo(m.toSeq : _*)
(a,1)
(b,2)
(z,26)

Upvotes: 9

jsalvata
jsalvata

Reputation: 2205

Just convert the map to a sequence of pairs using ".toSeq" and pass it to the var-args method postfixed with ":_*" (which is Scala syntax to allow passing a sequence as arguments to a var-args method).

Example:

def m(a: (String, Int)*) { for ((k, v) <- a) println(k+"->"+v) }
val x= Map("a" -> 1, "b" -> 2)
m(x.toSeq:_*)

In repl:

scala>   def m(a: (String, Int)*) { for ((k, v) <- a) println(k+"->"+v) }
m: (a: (String, Int)*)Unit

scala>   val x= Map("a" -> 1, "b" -> 2)
x: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1, b -> 2)

scala>   m(x.toSeq:_*)
a->1
b->2

Upvotes: -1

Arg
Arg

Reputation: 1916

I'm not sure but you can try converting map into array of tuples and then cast it to vararg type, like so:

Method(map.toArray: _*)

Upvotes: 0

Related Questions