Scala如何最好地将一个Collection转换成以键为值的Map?

11 浏览
0 Comments

Scala如何最好地将一个Collection转换成以键为值的Map?

如果我有一个类型为T的集合c,并且T上有一个属性p(比如类型是P),那么最好的提取键的映射方式是什么?

val c: Collection[T]
val m: Map[P, T]

一种方法是以下内容:

m = new HashMap[P, T]
c foreach { t => m add (t.getP, t) }

但现在我需要一个可变的映射。有更好的方法可以将其拆分成一行,并得到一个不可变的映射吗?(显然,我可以将上述内容转换为一个简单的库实用程序,就像在Java中一样,但我觉得在Scala中无需这样做)

admin 更改状态以发布 2023年5月21日
0
0 Comments

您可以使用可变数量的元组构建Map。因此,在集合上使用map方法将其转换为元组集合,然后使用:_*的技巧将结果转换为可变参数。

scala> val list = List("this", "maps", "string", "to", "length") map {s => (s, s.length)}
list: List[(java.lang.String, Int)] = List((this,4), (maps,4), (string,6), (to,2), (length,6))
scala> val list = List("this", "is", "a", "bunch", "of", "strings")
list: List[java.lang.String] = List(this, is, a, bunch, of, strings)
scala> val string2Length = Map(list map {s => (s, s.length)} : _*)
string2Length: scala.collection.immutable.Map[java.lang.String,Int] = Map(strings -> 7, of -> 2, bunch -> 5, a -> 1, is -> 2, this -> 4)

0
0 Comments

你可以使用

c map (t => t.getP -> t) toMap

但请注意,这需要2次遍历。

0