На самом деле, mapConserve
определяется как
def mapConserve[A <: AnyRef](xs: List[A])(f: A => A): List[A]
def mapConserve[B >: A <: AnyRef](f: A => B): List[B]
поэтому A
должен быть подтипом AnyRef
. Int
является подтипом AnyVal
, что приводит к ошибке.
scala> val l = List("foo", "bar", "baz")
l: List[java.lang.String] = List(foo, bar, baz)
scala> l.mapConserve(_.toUpperCase)
res4: List[java.lang.String] = List(FOO, BAR, BAZ)
scala> l.mapConserve(identity)
res5: List[java.lang.String] = List(foo, bar, baz)
Обновление:
Единственная разница между map
и mapConserve
, как это описано в scaladoc :
Создает новый список, применяя функцию ко всем элементам этого списка.
Как и xs map f, но возвращает xs без изменений, если функция f отображает все элементы на себя (как определено в eq).
scala> val xs = List.fill(1000000)("foo")
xs: List[java.lang.String] = List(foo, foo,...)
scala> xs.map(identity) eq xs
res48: Boolean = false
scala> xs.mapConserve(identity) eq xs
res49: Boolean = true
И xs mapConserve identity
примерно в пять раз быстрее в моем простом тесте.