18.7. Konwersje
Biblioteka standardowa udostępnia metody pozwalające dokonywać konwersji między różnymi rodzajami kolekcji. Nazwy tych metod składają się z prefiksu to oraz nazwy określającej rodzaj docelowej kolekcji. Na przykład metoda toArray zamienia kolekcję na tablicę.
scala> List(1,2,3,4).toArray res0: Array[Int] = Array(1, 2, 3, 4)
scala> Set("a","b","c").toArray
res1: Array[String] = Array(a, b, c)
scala> Map(1->"a", 2->"b").toArray
res2: Array[(Int, String)] = Array((1,a), (2,b))
Metody toList, toSeq, toIndexedSeq, toSet i toMap zamieniają kolekcję na odpowiednio: listę, sekwencję, sekwencję indeksowaną, zbiór i mapę.
scala> Map(1->"a", 2->"b").toList res3: List[(Int, String)] = List((1,a), (2,b)) scala> Array(1,2,3,4).toSeq res4: Seq[Int] = WrappedArray(1, 2, 3, 4) scala> Map(1->"a", 2->"b").toIndexedSeq res5: scala.collection.immutable.IndexedSeq[(Int, String)] = Vector((1,a), (2,b)) scala> List(1,2,3,4).toSet res6: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4) scala> Set((1,"a"),(2,"b")).toMap res7: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)
Metoda toStream zamienia kolekcję na strumień.
scala> val a = Set(1,2,3,4).toStream
a: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> a.force
res8: scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4)
scala> val b = Array("a","b","c").toStream
b: scala.collection.immutable.Stream[String] = Stream(a, ?)
scala> b.force
res9: scala.collection.immutable.Stream[String] = Stream(a, b, c)
scala> val c = List('x,'y,'z).toStream
c: scala.collection.immutable.Stream[Symbol] = Stream('x, ?)
scala> c.force
res10: scala.collection.immutable.Stream[Symbol] = Stream('x, 'y, 'z)
Zarówno standardowe biblioteki języków Scala, jak i Java, oferują cały zestaw klas reprezentujących kolekcje. Oba zestawy kolekcji nie są ze sobą kompatybilne. Poniższe przykłady pokazują nieudane próby przypisania obiektów kolekcji z jednej biblioteki do wartości mających typy z drugiej.
scala> val a: java.util.Set[Int] = scala.collection.Set[Int]()
<console>:10: error: type mismatch;
found : scala.collection.Set[Int]
required: java.util.Set[Int]
val a: java.util.Set[Int] = scala.collection.Set[Int]()
^
scala> val b: scala.collection.mutable.Set[Int] = new java.util.HashSet[Int]()
<console>:10: error: type mismatch;
found : java.util.HashSet[Int]
required: scala.collection.mutable.Set[Int]
val b: scala.collection.mutable.Set[Int] = new java.util.HashSet[Int]()
^
scala> val c: java.util.Map[String,String] =
| scala.collection.mutable.HashMap[String,String]()
<console>:11: error: type mismatch;
found : scala.collection.mutable.HashMap[String,String]
required: java.util.Map[String,String]
scala.collection.mutable.HashMap[String,String]()
^
scala> val d: scala.collection.mutable.Map[String,String] =
| new java.util.HashMap[String,String]()
<console>:11: error: type mismatch;
found : java.util.HashMap[String,String]
required: scala.collection.mutable.Map[String,String]
new java.util.HashMap[String,String]()
^
Biblioteka języka Scala udostępnia, w obiekcie scala.collection.JavaConversions, niejawne konwersje, przekształcające instancje kolekcji z jednej z bibliotek na instancje kolekcji z drugiej z nich. Poniższe przykłady pokazują, że wcześniej niedziałające przypisania zaczynają działać po zaimportowaniu niejawnych konwersji.
![]() | Mechanizm niejawnych konwersji jest opisany w punkcie 20.4. |
scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._
scala> val e: java.util.Set[Int] = scala.collection.Set[Int]()
e: java.util.Set[Int] = []
scala> val f: collection.Set[Int] = new java.util.HashSet[Int]()
f: scala.collection.Set[Int] = Set()
scala> val g: java.util.Map[String,String] =
| collection.mutable.HashMap[String,String]()
g: java.util.Map[String,String] = {}
scala> val h: collection.mutable.Map[String,String] =
| new java.util.HashMap[String,String]()
h: scala.collection.mutable.Map[String,String] = Map()
Obiekt scala.collection.JavaConverters udostępnia inny, alternatywny sposób konwersji pomiędzy kolekcjami z obu bibliotek — za pomocą metod asScala oraz asJava.
scala> import scala.collection.JavaConverters._ import scala.collection.JavaConverters._ scala> val a = Set(5,6,7,8) a: scala.collection.immutable.Set[Int] = Set(5, 6, 7, 8) scala> val b: java.util.Set[Int] = a.asJava b: java.util.Set[Int] = [5, 6, 7, 8] scala> val c: java.util.Set[Int] = new java.util.HashSet[Int]() c: java.util.Set[Int] = [] scala> c.add(2) res11: Boolean = true
scala> c.add(4) res12: Boolean = true scala> c.asScala res13: scala.collection.mutable.Set[Int] = Set(2, 4)

