Scala 从一组关键点创建贴图

Scala 从一组关键点创建贴图,scala,map,set,Scala,Map,Set,我有一组键,比如说set[MyKey],对于每个键,我想通过一些值函数计算值,比如说computeValueOf(key:MyKey)。最后,我想要一个Map映射key->value 在不进行太多迭代的情况下,最有效的方法是什么?可以将Tuple2的集合转换为映射,其中tuple的第一个元素将是键,第二个元素将是值 val setOfKeys = Set[MyKey]() setOfKeys.map(key => (key, computeValueOf(key)).toMap 这实际上

我有一组键,比如说
set[MyKey]
,对于每个键,我想通过一些值函数计算值,比如说
computeValueOf(key:MyKey)
。最后,我想要一个
Map
映射
key->value


在不进行太多迭代的情况下,最有效的方法是什么?

可以将
Tuple2
的集合转换为
映射,其中tuple的第一个元素将是键,第二个元素将是值

val setOfKeys = Set[MyKey]()
setOfKeys.map(key => (key, computeValueOf(key)).toMap

这实际上是一个非常简洁的应用程序,是我最喜欢的奇异的Scala巫毒:

type MyKey = Int

def computeValueOf(key: MyKey) = "value" * key
val mySet: Set[MyKey] = Set(1, 2, 3)

val myMap: Map[MyKey, String] =
  mySet.map(k => k -> computeValueOf(k))(collection.breakOut)

有关此处发生的情况的讨论,请参阅。与带有
toMap
的版本不同,这不会构造中间
,从而为您节省一些分配和遍历。不过,它的可读性也差得多,我之所以提供它,是因为你提到要避免“重复太多”。

当然,我真傻。我一直在兜圈子,为什么
toMap
函数和相关函数都期望元组中的值,这就是我问这个问题的原因。在这一点上仍然很幼稚:(.一如既往地感谢!!没问题。你需要一段时间才能了解所有的函数和它们的功能,然后它们就会成为你的第二天性。如果你切换到另一种语言,你会真的开始想念它们:)是的,在使用Java多年之后,我开始使用Scala。到目前为止,我很喜欢它,但仍然找不到解决问题的方法(从我今天的问题中你可以看到),这有时会让人沮丧。这比
setOfKeys.iterator.map(key=>(key,computeValueOf(key))避免了更多的迭代吗.toMap
?谢谢你的回答。我还需要进一步理解它。是的,我要求尽可能避免迭代的原因是因为我正在处理的问题有点组合性,所以节省迭代时间和
lazy val
ing在有意义的地方应该会有所帮助。@TravisBrown,你能再解释一点吗e
collection.breakOut
正在做什么?关键字
collection
从哪里来?它不是在任何地方声明的,但它是有效的。谢谢
collection
只是
scala.collection
包(你可以总是省略
scala.
部分)。解释
breakOut
很棘手,请看丹尼尔·索布拉尔的答案(上面链接)进行真正全面的尝试。简而言之,它说的是“找到一个构建器,它将构造适当的集合类型,并在映射过程中使用它”。