集合

Java 與 Scala 集合的轉換

語言

與 Scala 類似,Java 也有豐富的集合庫。這兩個集合庫之間有很多相似之處。例如,這兩個集合庫都認識迭代器、可迭代對象、集合、映射和序列。但它們之間也有重要的差異。特別是,Scala 集合庫更強調不可變集合,並提供了更多將集合轉換為新集合的運算。

有時,您可能需要從一個集合架構傳遞到另一個集合架構。例如,您可能希望像訪問 Scala 集合一樣訪問現有的 Java 集合。或者,您可能希望將 Scala 的集合之一傳遞給預期其 Java 對應項的 Java 方法。這很容易做到,因為 Scala 提供了 CollectionConverters 物件中所有主要集合類型之間的隱式轉換。特別是,您會發現以下類型之間的雙向轉換。

Iterator               <=>     java.util.Iterator
Iterator               <=>     java.util.Enumeration
Iterable               <=>     java.lang.Iterable
Iterable               <=>     java.util.Collection
mutable.Buffer         <=>     java.util.List
mutable.Set            <=>     java.util.Set
mutable.Map            <=>     java.util.Map
mutable.ConcurrentMap  <=>     java.util.concurrent.ConcurrentMap

若要啟用這些轉換,請從 CollectionConverters 物件匯入它們

scala> import scala.jdk.CollectionConverters._
import scala.jdk.CollectionConverters._
scala> import scala.jdk.CollectionConverters.*
import scala.jdk.CollectionConverters.*

這透過稱為 asScalaasJava 的擴充方法,啟用了 Scala 集合與其對應的 Java 集合之間的轉換

scala> import collection.mutable._
import collection.mutable._

scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3).asJava
val jul: java.util.List[Int] = [1, 2, 3]

scala> val buf: Seq[Int] = jul.asScala
val buf: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)

scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2).asJava
val m: java.util.Map[String,Int] = {abc=1, hello=2}
scala> import collection.mutable.*
import collection.mutable.*

scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3).asJava
val jul: java.util.List[Int] = [1, 2, 3]

scala> val buf: Seq[Int] = jul.asScala
val buf: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)

scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2).asJava
val m: java.util.Map[String,Int] = {abc=1, hello=2}

在內部,這些轉換透過設定一個「包裝器」物件來運作,該物件會將所有運算轉發到基礎集合物件。因此,在 Java 和 Scala 之間轉換時,集合從未被複製。一個有趣的特性是,如果您對 Java 類型進行往返轉換,轉換為其對應的 Scala 類型,再轉換回相同的 Java 類型,您會得到與開始時相同的集合物件。

某些其他 Scala 集合也可以轉換為 Java,但無法轉換回原始 Scala 類型

Seq           =>    java.util.List
mutable.Seq   =>    java.util.List
Set           =>    java.util.Set
Map           =>    java.util.Map

由於 Java 在類型中沒有區分可變和不可變集合,因此從(例如)scala.immutable.List 轉換會產生 java.util.List,其中所有變異操作都會擲出「UnsupportedOperationException」。以下是一個範例

scala> val jul = List(1, 2, 3).asJava
val jul: java.util.List[Int] = [1, 2, 3]

scala> jul.add(7)
java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)

此頁面的貢獻者