Domanda

In relazione al Stack Overflow domanda Scala equivalente di nuovo HashSet (Collection) , Come posso convertire una collezione di Java (java.util.List dire) in una collezione Scala List?

sto effettivamente cercando di convertire una chiamata API Java per Primavera SimpleJdbcTemplate, che restituisce un java.util.List<T>, in una HashSet immutabili Scala. Così, per esempio:

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

Questo sembra funzionare. La critica è il benvenuto!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
È stato utile?

Soluzione

Il tuo ultimo suggerimento funziona, ma si può anche evitare di usare jcl.Buffer:

Set(javaApi.query(...).toArray: _*)

Si noti che scala.collection.immutable.Set rendano disponibili di default grazie alla Predef.scala.

Altri suggerimenti

Per riferimento futuro: Con Scala 2.8, potrebbe essere fatto in questo modo:

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

set è un scala.collection.immutable.Set[String] dopo questo.

Ben James' risposta per una più modo esplicito (usando JavaConverters), che sembra essere raccomandato oggi.

Se si vuole essere più esplicito rispetto alle JavaConversions hanno manifestato a robinst di rispondere , è possibile utilizzare JavaConverters:

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet

JavaConversions ( di robinst risposta ) e JavaConverters (la risposta di Ben James ) sono stati deprecato con Scala 2.10 .

Al posto di JavaConversions uso:

import scala.collection.convert.wrapAll._

come suggerito da aleksandr_hramcov .

Al posto di JavaConverters uso:

import scala.collection.convert.decorateAll._

Per entrambi c'è anche la possibilità di importare solo le conversioni / convertitori a Java o Scala, rispettivamente, per esempio:.

import scala.collection.convert.wrapAsScala._

Aggiornamento: La dichiarazione di cui sopra che JavaConversions e JavaConverters sono stati deprecati sembra essere sbagliato. Ci sono state alcune proprietà deprecato in Scala 2.10, che ha portato warning di deprecazione durante l'importazione di loro. Così le importazioni si alternano qui sembrano essere solo alias. Anche se io ancora li preferisco, come IMHO i nomi sono più appropriati.

Si consiglia inoltre di esplorare questo eccellente libreria: scalaj-collezione che ha a due vie conversione tra collezioni Java e Scala. Nel tuo caso, per convertire un java.util.List alla lista Scala si può fare questo:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])

È possibile aggiungere le informazioni di tipo nella toArray Chiama per effettuare la Set parametrizzare:

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

Questo potrebbe essere preferibile in quanto il pacchetto collezioni sta attraversando un importante rilavorazione per Scala 2.8 e il pacchetto scala.collection.jcl è andare via

Un altro modo semplice per risolvere questo problema:

import collection.convert.wrapAll._

Si potrebbe convertire la collezione di Java per un array e poi creare una lista Scala da che:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

A partire Scala 2.13, pacchetto scala.jdk.CollectionConverters sostituisce pacchetti scala.collection.JavaConverters/JavaConversions._:

import scala.jdk.CollectionConverters._

// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top