wake-up-neo.net

Konvertieren einer Java Sammlung in eine Scala Sammlung

Im Zusammenhang mit Stack Overflow Frage Scala-Äquivalent von neuem HashSet (Collection), wie konvertiere ich ein Java collection (Java.util.List say) in eine Scala Sammlung List?

Ich versuche gerade, einen Java API-Aufruf in Spring'sSimpleJdbcTemplate umzuwandeln, der einen Java.util.List<T>, in eine Scala unveränderliche HashSet. Also 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( ... ) ) : _ *)
86
oxbow_lakes

Ihr letzter Vorschlag funktioniert, aber Sie können auch die Verwendung von jcl.Buffer Vermeiden:

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

Beachten Sie, dass scala.collection.immutable.Set Dank Predef.scala Standardmäßig verfügbar ist.

16
Jorge Ortiz

Zum späteren Nachschlagen: Mit Scala 2.8 könnte dies folgendermaßen 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.

Siehe auch Antwort von Ben James für eine ausführlichere Beschreibung (mit JavaConverters), die jetzt empfohlen zu werden scheint.

123
robinst

Wenn Sie expliziter sein wollen als die in Robinsts Antwort gezeigten JavaConversions, können Sie JavaConverter verwenden:

import scala.collection.JavaConverters._
val l = new Java.util.ArrayList[Java.lang.String]
val s = l.asScala.toSet
62
Ben James

JavaConversions ( Antwort von robinst ) und JavaConverters ( Antwort von Ben James ) sind veraltet mit - Scala 2.1.

Anstelle von JavaConversions verwenden Sie:

import scala.collection.convert.wrapAll._

wie vorgeschlagen von aleksandr_hramcov .

Anstelle von JavaConverters verwenden Sie:

import scala.collection.convert.decorateAll._

Für beide gibt es auch die Möglichkeit, nur die Konvertierungen/Konverter in Java bzw. Scala, z. B .:

import scala.collection.convert.wrapAsScala._

pdate: Die Aussage darüber, dass JavaConversions und JavaConverters veraltet waren, scheint falsch zu sein. Es gab einige veraltete Eigenschaften in Scala= 2.10, die beim Import zu Verfallswarnungen führten. Daher scheinen die alternativen Importe hier nur Aliase zu sein. Obwohl ich sie immer noch bevorzuge, da die Namen meiner Meinung nach mehr sind angemessen.

25
stempler

Vielleicht möchten Sie auch diese hervorragende Bibliothek erkunden: scalaj-collection mit bidirektionaler Konvertierung zwischen Java und Scala) Sammlungen. In Ihrem Fall können Sie eine Java.util.List nach Scala List konvertieren:

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

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

Ein anderer einfacher Weg, um dieses Problem zu lösen:

import collection.convert.wrapAll._
2

Sie können die Typinformationen im Aufruf von toArray hinzufügen, damit das Set parametrisiert wird:

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

Dies ist möglicherweise vorzuziehen, da das Collections-Paket für Scala 2.8 und das scala.collection.jcl-Paket going away überarbeitet wird

2
Aaron

Sie können die Java in ein Array konvertieren und dann eine Scala= Liste daraus erstellen:

val array = Java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
1
Fabian Steeg

Beginnend Scala 2.13, package 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")
0
Xavier Guihot