將您現有的 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)
舊函式庫中有兩個部分已被整體取代,且不建議使用警告不可行。
- 先前的
scala.collection.jcl
套件已不存在。此套件嘗試在 Scala 中模仿 Java 函式庫設計的層面,但這麼做破壞了許多對稱性。大多數想要 Java 函式庫的人會略過jcl
,直接使用java.util
。Scala 2.8 在 JavaConversions 物件中提供兩者函式庫之間的自動轉換機制,取代jcl
套件。 - 投影已進行概括和清理,現在可用作檢視。看來投影很少使用,因此這項變更不應影響太多程式碼。
因此,如果您的程式碼使用 jcl
或投影,可能需要進行一些小幅改寫。