Scala Language
Java-Interoperabilität
Suche…
Konvertieren von Scala-Sammlungen in Java-Sammlungen und umgekehrt
Wenn Sie eine Collection an eine Java-Methode übergeben müssen:
import scala.collection.JavaConverters._ val scalaList = List(1, 2, 3) JavaLibrary.process(scalaList.asJava)
Wenn der Java-Code eine Java-Sammlung zurückgibt, können Sie diese auf ähnliche Weise in eine Scala-Sammlung umwandeln:
import scala.collection.JavaConverters._ val javaCollection = JavaLibrary.getList val scalaCollection = javaCollection.asScala
Beachten Sie, dass es sich hierbei um Dekorateure handelt, die die zugrunde liegenden Sammlungen lediglich in eine Scala- oder Java-Sammlungsschnittstelle einschließen. Deshalb kopieren die Aufrufe .asJava
und .asScala
die Sammlungen nicht.
Arrays
Arrays sind reguläre JVM-Arrays mit dem gewissen Unterschied, dass sie als unveränderlich behandelt werden und spezielle Konstruktoren und implizite Konvertierungen aufweisen. Konstruieren Sie sie ohne das new
Schlüsselwort.
val a = Array("element")
Jetzt a
hat Typ Array[String]
.
val acs: Array[CharSequence] = a
//Error: type mismatch; found : Array[String] required: Array[CharSequence]
Obwohl String
in CharSequence
konvertierbar CharSequence
, kann Array[String]
nicht in Array[CharSequence]
.
Sie können ein Array
wie andere Sammlungen verwenden, dank der impliziten Konvertierung in TraversableLike
ArrayOps
:
val b: Array[Int] = a.map(_.length)
Die meisten Scala-Sammlungen ( TraversableOnce
) verfügen über eine toArray
Methode, die ein implizites ClassTag
zum ClassTag
des Ergebnisarrays verwendet:
List(0).toArray
//> res1: Array[Int] = Array(0)
Dies macht es einfach, TraversableOnce
in Ihrem Scala-Code zu verwenden und dann an Java-Code zu übergeben, der ein Array erwartet.
Konvertierungen von Scala und Java
Scala bietet implizite Konvertierungen zwischen allen wichtigen Auflistungstypen im JavaConverters-Objekt an.
Die folgenden Typkonvertierungen sind bidirektional.
Scala-Typ | Java-Typ |
---|---|
Iterator | java.util.Iterator |
Iterator | java.util.Enumeration |
Iterator | java.util |
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 |
Bestimmte andere Scala-Sammlungen können auch nach Java konvertiert werden, haben jedoch keine Konvertierung in den ursprünglichen Scala-Typ:
Scala-Typ | Java-Typ |
---|---|
Seq | java.util.List |
veränderbar | java.util.List |
einstellen | java.util.Set |
Karte | java.util.Map |
Referenz :
Konvertierungen zwischen Java- und Scala-Sammlungen
Funktionsschnittstellen für Scala-Funktionen - Scala-Java 8-kompatibel
Ein Java 8-Kompatibilitätskit für Scala.
Die meisten Beispiele werden aus der Readme-Datei kopiert
Konverter zwischen scala.FunctionN und 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
Konverter zwischen den Klassen scala.Option und java.util Optional, OptionalDouble, OptionalInt und OptionalLong.
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
}
Konverter von Scala-Sammlungen zu 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)