Scala将集合按键转换为映射的最佳方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

如果我有收藏c类型T有一项财产pT(类型)P(比如说),做一件事最好的方法是什么?按提取映射键?

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

一种方法是:

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

但现在我需要一个可变地图。是否有更好的方法来完成这个操作,这样它就在1行中,而我的结果是不变地图?(显然,我可以像在Java中一样,将上面的内容转换为一个简单的库实用程序,但我怀疑在Scala中没有必要)

提问于
用户回答回答于
用户回答回答于

可以用可变数量的元组构造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)

扫码关注云+社区