How to create an immutable map/set from a seq?

28,511

Solution 1

In Scala 2.8:

Welcome to Scala version 2.8.0.r20327-b20091230020149 (Java HotSpot(TM) Client VM, Java 1.6.
Type in expressions to have them evaluated.
Type :help for more information.

scala> val seq: Seq[(String,Object)] = ("a","A")::("b","B")::Nil
seq: Seq[(String, java.lang.Object)] = List((a,A), (b,B))

scala> val map = Map(seq: _*)
map: scala.collection.immutable.Map[String,java.lang.Object] = Map(a -> A, b -> B)

scala> val set = Set(seq: _*)
set: scala.collection.immutable.Set[(String, java.lang.Object)] = Set((a,A), (b,B))

scala>

Edit 2010.1.12

I find that there is a more simple way to create set.

scala> val seq: Seq[(String,Object)] = ("a","A")::("b","B")::Nil
seq: Seq[(String, java.lang.Object)] = List((a,A), (b,B))

scala> val set = seq.toSet
set: scala.collection.immutable.Set[(String, java.lang.Object)] = Set((a,A), (b,B))

Solution 2

To convert a Seq to a Map, simply call toMap on the Seq. Note that the elements of the Seq must be Tuple2 ie. (X,Y) or (X->Y)

scala> val seq: Seq[(String,String)] = ("A","a")::("B","b")::("C","c")::Nil
seq: Seq[(java.lang.String, java.lang.String)] = List((A,a), (B,b), (C,c))

scala> seq.toMap
res0: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,a), (B,b), (C,c))

To convert a Seq to a Set, simply call toSet on the Seq.

scala> val seq: Seq[String] = "a"::"b"::"c"::Nil
seq: Seq[java.lang.String] = List(a, b, c)

scala> seq.toSet
res1: scala.collection.immutable.Set[java.lang.String] = Set(a, b, c)
Share:
28,511
Michael Barker
Author by

Michael Barker

Updated on November 28, 2020

Comments

  • Michael Barker
    Michael Barker over 3 years

    I am try to construct immutable Sets/Maps from a Seq. I am currently doing the following:

    val input: Seq[(String, Object)] = //.....
    Map[String, Object]() ++ input
    

    and for sets

    val input: Seq[String] = //.....
    Set[String]() ++ input
    

    Which seems a little convoluted, is there a better way?

  • Vilius Normantas
    Vilius Normantas over 13 years
    val map = Map(seq: _*) gave me that "scala feeling" in my stomach again :) Thanks
  • ziggystar
    ziggystar about 13 years
    Drowning in underscores and special characters in general?
  • ziggystar
    ziggystar about 13 years
    Please look also at Chris' answer which features toMap in addition to toSet.