2010-07-16 4 views
2

В 2.7 я мог бы сделать следующее:Scala 2.8 и карта просмотров

val lazyM: Map[_, _] = map.projection.mapElements(v => expCalc(v)) //MAP VIEW 

Я не могу найти способ сделать это в 2.8 и фактически заканчиваясь с картой:

val m: Map[_, _] = map.view.map(kv => kv._1 -> expCalc(kv._2)).toMap //STRICT 

Это похоже на значительную потерю функциональности, и поэтому я предполагаю, что он где-то скрывается в библиотеке коллекции. У кого-нибудь есть идеи?

Редактировать - глупо я предположил, что mapValues ​​был точно такой же, как старые mapElements

ответ

7

Несколько удивительно, Map#mapValues производит (преобразованные) вид:

scala> Map(1 -> 2, 3 -> 4, 5 -> 6) 
res0: scala.collection.immutable.Map[Int,Int] = Map((1,2), (3,4), (5,6)) 

scala> res0.mapValues { v => println("computing from " + v); v + 1 } 
computing from 2 
computing from 4 
computing from 6 
res1: scala.collection.immutable.Map[Int,Int] = Map((1,3), (3,5), (5,7)) 

scala> res1(1) 
computing from 2 
res2: Int = 3 

scala> res1(5) 
computing from 6 
res3: Int = 7 
+5

Это не совсем «ленивым »(нуль или одна оценка для каждого ключа с теми задержками, которые были отложены как можно дольше), это больше похоже на« динамический », поскольку функция, предоставляемая в вызове' mapValues', оценивается * каждый раз, когда извлекается ключ в полученном виде карты *. –

+0

Да, это то, что я имел в виду. Я не должен был использовать слово lazy –

+0

Я бы сказал, что «mapValues ​​возвращает представление». –