Scala Language
Java-interoperabiliteit
Zoeken…
Scala-verzamelingen converteren naar Java-verzamelingen en vice versa
Wanneer u een verzameling moet doorgeven aan een Java-methode:
import scala.collection.JavaConverters._ val scalaList = List(1, 2, 3) JavaLibrary.process(scalaList.asJava)
Als de Java-code een Java-verzameling retourneert, kunt u deze op dezelfde manier in een Scala-verzameling veranderen:
import scala.collection.JavaConverters._ val javaCollection = JavaLibrary.getList val scalaCollection = javaCollection.asScala
Merk op dat dit decorateurs zijn, dus verpakken ze alleen de onderliggende collecties in een Scala- of Java-collectie-interface. Daarom kopiëren de aanroepen .asJava
en .asScala
de collecties niet.
arrays
Arrays zijn reguliere JVM-arrays met een twist dat ze als invariant worden behandeld en speciale constructors en impliciete conversies hebben. Construeer ze zonder het new
trefwoord.
val a = Array("element")
Nu a
heeft soort Array[String]
.
val acs: Array[CharSequence] = a
//Error: type mismatch; found : Array[String] required: Array[CharSequence]
Hoewel String
converteerbaar is naar CharSequence
, is Array[String]
niet converteerbaar naar Array[CharSequence]
.
Je kunt een Array
zoals andere collecties, dankzij een impliciete conversie naar TraversableLike
ArrayOps
:
val b: Array[Int] = a.map(_.length)
De meeste Scala-collecties ( TraversableOnce
) hebben een toArray
methode die een impliciete ClassTag
om de resultatiereeks te construeren:
List(0).toArray
//> res1: Array[Int] = Array(0)
Dit maakt het gemakkelijk om TraversableOnce
in uw Scala-code te gebruiken en vervolgens door te geven aan Java-code die een array verwacht.
Conversies van het type Scala en Java
Scala biedt impliciete conversies tussen alle belangrijke collectietypen in het JavaConverters-object.
De volgende type conversies zijn bidirectioneel.
Scala Type | Java-type |
---|---|
iterator | java.util.Iterator |
iterator | java.util.Enumeration |
iterator | java.util.Iterable |
iterator | java.util.Collection |
mutable.Buffer | java.util.List |
mutable.Set | java.util.Set |
mutable.Map | java.util.Map |
mutable.ConcurrentMap | java.util.concurrent.ConcurrentMap |
Bepaalde andere Scala-collecties kunnen ook worden geconverteerd naar Java, maar hebben geen conversie terug naar het originele Scala-type:
Scala Type | Java-type |
---|---|
Seq | java.util.List |
mutable.Seq | java.util.List |
reeks | java.util.Set |
Kaart | java.util.Map |
Referentie :
Conversies tussen Java- en Scala-collecties
Functionele interfaces voor Scala-functies - scala-java8-compat
Een Java 8-compatibiliteitskit voor Scala.
De meeste voorbeelden zijn gekopieerd van Readme
Converters tussen scala.FunctionN en java.util.function
import java.util.function._
import scala.compat.java8.FunctionConverters._
val foo: Int => Boolean = i => i > 7
def testBig(ip: IntPredicate) = ip.test(9)
println(testBig(foo.asJava)) // Prints true
val bar = new UnaryOperator[String]{ def apply(s: String) = s.reverse }
List("cod", "herring").map(bar.asScala) // List("doc", "gnirrih")
def testA[A](p: Predicate[A])(a: A) = p.test(a)
println(testA(asJavaPredicate(foo))(4)) // Prints false
Converters tussen scala.Option en java.util-klassen Optioneel, OptioneelDubbel, OptioneelInt en Optioneel Lang.
import scala.compat.java8.OptionConverters._
class Test {
val o = Option(2.7)
val oj = o.asJava // Optional[Double]
val ojd = o.asPrimitive // OptionalDouble
val ojds = ojd.asScala // Option(2.7) again
}
Converters van Scala-collecties naar Java 8 Streams
import java.util.stream.IntStream
import scala.compat.java8.StreamConverters._
import scala.compat.java8.collectionImpl.{Accumulator, LongAccumulator}
val m = collection.immutable.HashMap("fish" -> 2, "bird" -> 4)
val parStream: IntStream = m.parValueStream
val s: Int = parStream.sum
// 6, potientially computed in parallel
val t: List[String] = m.seqKeyStream.toScala[List]
// List("fish", "bird")
val a: Accumulator[(String, Int)] = m.accumulate // Accumulator[(String, Int)]
val n = a.stepper.fold(0)(_ + _._1.length) +
a.parStream.count // 8 + 2 = 10
val b: LongAccumulator = java.util.Arrays.stream(Array(2L, 3L, 4L)).accumulate
// LongAccumulator
val l: List[Long] = b.to[List] // List(2L, 3L, 4L)