2012-01-18 80 views

回答

9
original.mapValues(Seq(_)) 

注意mapValues返回地图视图,因此函数(Seq(_))将每一个元件被访问的时间重新计算。为了避免这种情况,只需使用普通map

original.map{ case (k,v) => (k, Seq(v)) } 

用法:

scala> val original = Map("a" -> "b", "c" -> "d") 
original: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(a -> b, c -> d) 

scala> original.mapValues(Seq(_)) 
res1: scala.collection.immutable.Map[java.lang.String,Seq[java.lang.String]] = Map(a -> List(b), c -> List(d)) 
+0

感谢您的帮助! – chiappone 2012-01-18 18:44:58

+2

+1关于视图评估语义的提示。 – missingfaktor 2012-01-18 20:08:56

2

您可以通过使用:->从Scalaz避免一些重复代码。

如果tTuple2,f <-: t :-> g相当于(f(t._1), g(t._2))

scala> import scalaz._, Scalaz._ 
import scalaz._ 
import Scalaz._ 

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

scala> m.map(_ :-> Seq.singleton) 
warning: there were 1 deprecation warnings; re-run with -deprecation for details 
res15: scala.collection.immutable.Map[Int,Seq[Symbol]] = Map(1 -> List('a), 2 -> List('b)) 

scala> m.map(_ :-> (x => Seq(x))) 
res16: scala.collection.immutable.Map[Int,Seq[Symbol]] = Map(1 -> List('a), 2 -> List('b))