Frage

In Verbindung stehende Überlauf Frage Stack Scala äquivalent neuen HashSet (Sammlung) , wie kann ich konvertieren eine Java-Sammlung (java.util.List sagen) in eine Scala Sammlung List?

Ich versuche eigentlich eine Java-API-Aufruf zu konvertieren href="http://en.wikipedia.org/wiki/Spring_Framework" rel="noreferrer"> Spring SimpleJdbcTemplate zum java.util.List<T> zurück in eine Scala unveränderlich HashSet. So zum Beispiel:

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

Das scheint zu funktionieren. Kritik ist willkommen!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
War es hilfreich?

Lösung

Ihr letzter Vorschlag funktioniert, aber Sie können auch vermeiden jcl.Buffer mit:

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

Beachten Sie, dass scala.collection.immutable.Set ist standardmäßig dank Predef.scala zur Verfügung gestellt.

Andere Tipps

Für die Zukunft: Mit Scala 2.8, könnte es wie folgt geschehen:

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

set ist ein scala.collection.immutable.Set[String] danach.

Auch Ben James' Antwort für mehr sehen explizite Art und Weise (mit JavaConverters), die jetzt empfohlen zu sein scheint.

Wenn Sie mehr explizit sein wollen als die JavaConversions in robinst des demonstriert beantworten , können Sie JavaConverters verwenden:

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

JavaConversions ( robinst Antwort ) und JavaConverters ( Ben James Antwort ) wurden als veraltet mit Scala 2.10 .

Anstelle von JavaConversions Verwendung:

import scala.collection.convert.wrapAll._

wie von aleksandr_hramcov .

Anstelle von JavaConverters Verwendung:

import scala.collection.convert.decorateAll._

Für beide gibt es auch die Möglichkeit, die Wandlungen / Konverter zu Java oder Scala nur zu importieren bzw. z.

import scala.collection.convert.wrapAsScala._

Update: Die Aussage über das JavaConversions und JavaConverters wurden als veraltet scheint falsch zu sein. Es gab einige veraltete Objekte in Scala 2.10, die in deprecation Warnungen ergaben sich, wenn sie zu importieren. So sind die alternativen Importe hier scheinen nur Aliase zu sein. Obwohl ich sie immer noch lieber, als IMHO sind die Namen besser geeignet.

Sie können auch diese ausgezeichnete Bibliothek erkunden wollen: scalaj-Sammlung , die Zwei-Wege hat zwischen Java und Scala Sammlungen Konvertierung. In Ihrem Fall eine java.util.List zu Scala Liste konvertieren Sie dies tun können:

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])

Sie können die Typinformationen in der hinzufügen toArray das Set parametriert werden, um zu nennen:

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

Dies könnte vorteilhaft sein, da die Sammlung Paket ist für Scala 2.8 durch eine große Nacharbeit zu gehen und das scala.collection.jcl Paket ist weggeht

Eine weitere einfache Möglichkeit, dieses Problem zu lösen:

import collection.convert.wrapAll._

Sie können die Java-Sammlung in ein Array umwandeln und dann eine Scala Liste aus, dass erstellen:

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

Starten Scala 2.13, Paket scala.jdk.CollectionConverters ersetzt Pakete 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")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top