I have a Java API that returns a List like:
public List<?> getByXPath(String xpathExpr)
I am using the below scala code:
val lst = node.getByXPath(xpath)
Now if I try scala syntax sugar like:
lst.foreach{ node => ... }
it does not work. I get the error:
value foreach is not a member of java.util.List[?0]
It seems I need to convert Java List to Scala List. How to do that in above context?
Since scala 2.8.1 use
JavaConverters._
to convert scala and Java collections using asScala and asJava methods.import scala.collection.JavaConverters._
javalist.asScala
scalaSeq.asJava
see the Conversion relationship scala doc site
I was looking for an answer written in Java and surprisingly couldn't find any clean solutions here. After a while I was able to figure it out so I decided to add it here in case someone else is looking for the Java implementation (I guess it also works in Scala?):
EDIT: Note that this is deprecated since 2.12.0. Use
JavaConverters
instead. (comment by @Yaroslav)Since Scala 2.8 this conversion is now built into the language using:
works.
asScala
did not workShortcut to convert java list to scala list
import scala.collection.JavaConverters._
myjavaList.asScala.toList
If you have to convert a Java
List<ClassA>
to a ScalaList[ClassB]
, then you must do the following:1) Add
2) Use methods
asScala
,toList
and thenmap
3) Add the following to the
ClassB
constructor that receivesClassA
as a parameter:There's a handy Scala object just for this - scala.collection.JavaConverters
You can do the import and
asScala
afterwards as follows:This should give you Scala's
Buffer
representation allowing you to accomplishforeach
.