Как создать неизменяемую карту/набор из seq?
Я пытаюсь построить неизменяемые Sets/Maps из Seq. В настоящее время я делаю следующее:
val input: Seq[(String, Object)] = //.....
Map[String, Object]() ++ input
и для множеств
val input: Seq[String] = //.....
Set[String]() ++ input
Что кажется немного запутанным, есть ли лучший способ?
Ответы
Ответ 1
В 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>
Изменить 2010.1.12
Я нахожу, что существует более простой способ создания набора.
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))
Ответ 2
Чтобы преобразовать a Seq
в Map
, просто вызовите toMap
на Seq
. Обратите внимание, что элементы Seq
должны быть Tuple2
т.е. (X,Y)
или (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))
Чтобы преобразовать a Seq
в Set
, просто вызовите toSet
на 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)