我有一組鍵,比如Set[MyKey]
,對於每個要通過某個值函數計算值的鍵,可以說是computeValueOf(key: MyKey)
。最後,我想要有一個Map
哪些地圖key -> value
從一組鍵中創建一個映射
什麼是最有效的方式來做到這一點,而不是迭代太多?
我有一組鍵,比如Set[MyKey]
,對於每個要通過某個值函數計算值的鍵,可以說是computeValueOf(key: MyKey)
。最後,我想要有一個Map
哪些地圖key -> value
從一組鍵中創建一個映射
什麼是最有效的方式來做到這一點,而不是迭代太多?
實際上這是collection.breakOut
,我最喜歡的離奇斯卡拉巫術的一個漂亮整潔的應用程序:
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)
什麼這裏發生了一些討論見this answer。與toMap
不同,這不會構建中間Set
,節省您一些分配和遍歷。但它的可讀性也較差 - 我只提供它,因爲你提到你想避免「迭代太多」。
Tuple2
s的集合可以轉換爲Map
,其中元組的第一個元素是鍵,第二個元素是值。
val setOfKeys = Set[MyKey]()
setOfKeys.map(key => (key, computeValueOf(key)).toMap
這是否避免了比'setOfKeys.iterator.map(key =>(key,computeValueOf(key)).toMap'多的反覆? – scand1sk
感謝您的回答,我仍然需要多瞭解一點。請儘量避免迭代,因爲我正在處理的問題有點組合,所以保存迭代和「惰性val」應該有所幫助。 – jbx
@TravisBrown,請你多解釋一下'collection.breakOut'在做什麼?關鍵字'collection'來自哪裏?它沒有被聲明在任何地方,但它的工作。謝謝 – jbx