集合(Scala 2.8 - 2.12)

从 Scala 2.7 迁移

语言

将你现有的 Scala 应用程序移植到使用新集合应该几乎是自动的。只有几个可能的问题需要解决。

通常,Scala 2.7 集合的旧功能已被保留。某些功能已被弃用,这意味着它们将在某些未来版本中被删除。在 Scala 2.8 中编译使用这些功能的代码时,你将收到弃用警告。在少数情况下,弃用是不可行的,因为所讨论的操作在 2.8 中被保留,但含义或性能特征发生了变化。在 2.8 下编译时,这些情况将被标记为迁移警告。要获得有关如何更改代码的建议的完整弃用和迁移警告,请将 -deprecation-Xmigration 标志传递给 scalac(请注意,-Xmigration 是一个扩展选项,因此它以 X 开头)。你还可以将相同的选项传递给 scala REPL,以便在交互式会话中获取警告。示例

>scala -deprecation -Xmigration
Welcome to Scala version 2.8.0.final
Type in expressions to have them evaluated.
Type :help for more information.
scala> val xs = List((1, 2), (3, 4))
xs: List[(Int, Int)] = List((1,2), (3,4))
scala> List.unzip(xs)
<console>:7: warning: method unzip in object List is deprecated: use xs.unzip instead of List.unzip(xs)
       List.unzip(xs)
            ^
res0: (List[Int], List[Int]) = (List(1, 3),List(2, 4))
scala> xs.unzip
res1: (List[Int], List[Int]) = (List(1, 3),List(2, 4))
scala> val m = xs.toMap
m: scala.collection.immutable.Map[Int,Int] = Map((1,2), (3,4))
scala> m.keys
<console>:8: warning: method keys in trait MapLike has changed semantics:
As of 2.8, keys returns Iterable[A] rather than Iterator[A].
       m.keys
         ^
res2: Iterable[Int] = Set(1, 3)

旧库中有两部分已被整体替换,并且不适合弃用警告。

  1. 之前的 scala.collection.jcl 包已消失。此包尝试模仿 Scala 中 Java 集合库设计的方面,但在这样做时破坏了许多对称性。大多数想要 Java 集合的人绕过了 jcl 并直接使用了 java.util。Scala 2.8 在 JavaConversions 对象中提供了两个集合库之间的自动转换机制,该对象替换了 jcl 包。
  2. 投影已被概括和清理,现在可用作视图。投影似乎很少使用,因此此更改不应影响太多代码。

因此,如果你的代码同时使用了 jcl 或投影,则可能需要进行一些小的重写。

此页面的贡献者