Domanda

Come convertire Scala scala.List in Java java.util.List?

È stato utile?

Soluzione

Lista Scala e Lista Java sono due bestie diverse, perché il primo è immutabile e la seconda è mutevole. Quindi, per ottenere da uno all'altro, è necessario prima di convertire l'elenco Scala in una collezione mutevole.

In Scala 2.7:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

Da Scala 2.8 in poi:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

Tuttavia, asList in quell'esempio non è necessario se il tipo previsto è un List Java, la conversione è implicito, come dimostra l'ultima linea.

Altri suggerimenti

Non capisco perché questo non è stato menzionato prima, ma penso che il modo più intuitivo è quello di richiamare il metodo asJava decoratore di JavaConverters direttamente sulla lista Scala:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

Per riassumere le risposte precedenti

Supponendo di avere quanto segue List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

Se vuoi essere esplicito E dillo esattamente cosa vuoi convertire:

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

Se tu non voglio conversioni di controllo condiviso e lascia che il compilatore faccia implicito Lavoro per te:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

Dipende da te come vuoi controllare il tuo codice.

Piuttosto vecchie domande, anche se io risponderò, dato ma la maggior parte dei suggerimenti sono deprecati.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

Aggiorna

con scala 2.9.2:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

risultato

[1, 2, 3]

Scala 2.13 di partenza, il pacchetto scala.jdk.CollectionConverters fornisce asJava tramite un pappone di Seq e sostituisce pacchetti scala.collection.JavaConverters/JavaConversions:

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

Per i singoli invocazioni, farlo a mano potrebbe essere la soluzione più semplice:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

Non ho misurare le prestazioni.

Basta fare come sopra proposta produce elenco immutabile anche sul lato Java. L'unica soluzione di lavoro che ho trovato è questo:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }

Dal Scala 2.12.0 JavaConversions è stato deprecato.

Quindi, la soluzione più semplice per me è stato:

java.util.Arrays.asList("a","b","c")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top