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)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow