Converting a Java collection into a Scala collection
Solution 1
Your last suggestion works, but you can also avoid using jcl.Buffer
:
Set(javaApi.query(...).toArray: _*)
Note that scala.collection.immutable.Set
is made available by default thanks to Predef.scala
.
Solution 2
For future reference: With Scala 2.8, it could be done like this:
import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet
set
is a scala.collection.immutable.Set[String]
after this.
Also see Ben James' answer for a more explicit way (using JavaConverters), which seems to be recommended now.
Solution 3
If you want to be more explicit than the JavaConversions demonstrated in robinst's answer, you can use JavaConverters:
import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
Solution 4
JavaConversions (robinst's answer) and JavaConverters (Ben James's answer) have been deprecated with Scala 2.10.
Instead of JavaConversions use:
import scala.collection.convert.wrapAll._
as suggested by aleksandr_hramcov.
Instead of JavaConverters use:
import scala.collection.convert.decorateAll._
For both there is also the possibility to only import the conversions/converters to Java or Scala respectively, e.g.:
import scala.collection.convert.wrapAsScala._
Update: The statement above that JavaConversions and JavaConverters were deprecated seems to be wrong. There were some deprecated properties in Scala 2.10, which resulted in deprecation warnings when importing them. So the alternate imports here seem to be only aliases. Though I still prefer them, as IMHO the names are more appropriate.
Solution 5
You may also want to explore this excellent library: scalaj-collection that has two-way conversion between Java and Scala collections. In your case, to convert a java.util.List to Scala List you can do this:
val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
oxbow_lakes
Currently programming in scala and Java at GSA Capital, a multiple-award-winning quantitative investment manager. Experience: Scala (since 2008) Java (since 1999) SQLServer git
Updated on June 10, 2020Comments
-
oxbow_lakes almost 4 years
Related to Stack Overflow question Scala equivalent of new HashSet(Collection) , how do I convert a Java collection (
java.util.List
say) into a Scala collectionList
?I am actually trying to convert a Java API call to Spring's
SimpleJdbcTemplate
, which returns ajava.util.List<T>
, into a Scala immutableHashSet
. So for example:val l: java.util.List[String] = javaApi.query( ... ) val s: HashSet[String] = //make a set from l
This seems to work. Criticism is welcome!
import scala.collection.immutable.Set import scala.collection.jcl.Buffer val s: scala.collection.Set[String] = Set(Buffer(javaApi.query( ... ) ) : _ *)
-
oxbow_lakes about 15 yearsThis isn't great because my java.util.List is coming back out of a Java API as a parametrized list (so my call to the API yields a java.util.List<String>) - I'm trying to turn this into a scala immutable HashSet
-
oxbow_lakes about 15 yearsThis suggestion doesn't work where I want to keep the type information
-
Michael Neale over 13 yearsThat library is the greatest thing ever. Really really works well.
-
Surya Suravarapu almost 12 yearsRevisiting this after couple of years, Scala's JavaConverters is the way to go.
-
asiviero over 11 yearsLooks like now
JavaConversions
has some implicits making thetoSet
call not necessary. -
krookedking about 10 years@Rajish I think it's better if the conversion is explicit (see stackoverflow.com/questions/8301947/…)
-
ajkl over 9 yearsthis is a great answer and solved my problem. Most of the methods mentioned on the internet just convert the (eg) java.util.List[java.lang.Long] to scala.collection.immutable.List[java.lang.Long]. So this method worked for me to convert it to scala.collection.immutable.List[scala.Long]
-
Joost den Boer over 7 yearsWhy do you say the JavaConversions and JavaConverters are deprecated? In the current documentation 2.11.8 both are not marked as being deprecated and they also do not have a reference to 'decorateAll' or 'wrapAll' stating that is the new and preferred usage.
-
stempler over 7 years@JoostdenBoer Seems there were some deprecated decorators there in Scala 2.10, though they seem to have been removed again with Scala 2.11.
-
Abhishek Sengupta almost 4 yearsyou are right, its better to use import scala.collection.JavaConverters._