使用循环在Scala中创建地图

3

我正在尝试在获取列表中每个项目的结果后创建地图。目前为止,我尝试了以下方法:

val sourceList: List[(Int, Int)] = ....
val resultMap: Map[Int, Int] = for(srcItem <- sourceList) {
  val result: Int = someFunction(srcItem._1)
  Map(srcItem._1 -> result)
}

但是我在IntelliJ中遇到了类型不匹配的错误,我肯定没有正确地编写语法。我认为我不能使用yield,因为我不想要Map列表。使用for循环创建Map的正确方法是什么?有什么建议吗?

1个回答

7
最简单的方法是将地图创建为元组列表:
val resultMap = sourceList.map(item => (item._1, someFunction(item._1))).toMap

或者,按照单子的方式:
val listOfTuples = for {
  (value, _) <- sourceList
} yield (value, someFunction(value))

val resultMap = listOfTuples.toMap

另外,如果你想避免创建 listOfTuples,你可以通过在 sourceList 上调用 .view,然后再调用 toMap 来使转换变为懒惰的:

val resultMap = sourceList.view
                          .map(item => (item._1, someFunction(item._1)))
                          .toMap

最后,如果你真的想避免生成额外的对象,你可以使用一个可变映射,并使用+=.put将键和值添加到其中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接