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)

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.