Szukaj…


Konwertowanie kolekcji Scala na kolekcje Java i odwrotnie

Gdy musisz przekazać kolekcję do metody Java:

import scala.collection.JavaConverters._

val scalaList = List(1, 2, 3)
JavaLibrary.process(scalaList.asJava)

Jeśli kod Java zwraca kolekcję Java, możesz przekształcić ją w kolekcję Scala w podobny sposób:

import scala.collection.JavaConverters._

val javaCollection = JavaLibrary.getList
val scalaCollection = javaCollection.asScala

Zauważ, że są to dekoratory, więc po prostu zawijają bazowe kolekcje w interfejs kolekcji Scala lub Java. Dlatego wywołania .asJava i .asScala nie kopiują kolekcji.

Tablice

Tablice są zwykłymi tablicami JVM, z tą różnicą, że są traktowane jako niezmienne i mają specjalne konstruktory i niejawne konwersje. Zbuduj je bez new słowa kluczowego.

 val a = Array("element")

Teraz ma typu a Array[String] .

 val acs: Array[CharSequence] = a
 //Error: type mismatch;  found   : Array[String]  required: Array[CharSequence]

Chociaż String można konwertować na CharSequence , Array[String] nie można konwertować na Array[CharSequence] .

Możesz używać Array jak innych kolekcji, dzięki niejawnej konwersji na TraversableLike ArrayOps :

 val b: Array[Int] = a.map(_.length)

Większość kolekcji Scala ( TraversableOnce ) ma metodę toArray przyjmującą niejawny ClassTag do skonstruowania tablicy wyników:

 List(0).toArray
 //> res1: Array[Int] = Array(0)

Ułatwia to użycie dowolnego TraversableOnce w kodzie Scala, a następnie przekazanie go do kodu Java, który oczekuje tablicy.

Konwersje typu Scala i Java

Scala oferuje niejawne konwersje między wszystkimi głównymi typami kolekcji w obiekcie JavaConverters.

Następujące typy konwersji są dwukierunkowe.

Typ Scala Typ Java
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

Niektóre inne kolekcje Scali można również przekonwertować na Javę, ale nie mają one konwersji z powrotem do oryginalnego typu Scala:

Typ Scala Typ Java
Seq java.util.List
mutable. sekw java.util.List
Zestaw java.util.Set
Mapa java.util.Map

Odniesienie :

Konwersje między kolekcjami Java i Scala

Interfejsy funkcjonalne dla funkcji Scala - scala-java8-kompatybil

Zestaw kompatybilny z Java 8 dla Scali.

Większość przykładów jest kopiowana z Readme

Konwertery między scala.FunctionN i 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

Konwertery między klasami scala.Option i java.util Opcjonalne, OptionalDouble, OptionalInt i 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
    }

Konwertery z kolekcji Scala na strumienie Java 8

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow