Convert Java List to Scala Seq
Solution 1
JavaConverters is what I needed to solve this.
import scala.collection.JavaConverters;
public Seq<String> convertListToSeq(List<String> inputList) {
return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}
Solution 2
JavaConversions
should work. I think, you are looking for something like this: JavaConversions.asScalaBuffer(a).toSeq()
Solution 3
Starting Scala 2.13
, package scala.jdk.javaapi.CollectionConverters
replaces deprecated packages scala.collection.JavaConverters/JavaConversions
:
import scala.jdk.javaapi.CollectionConverters;
// List<String> javaList = Arrays.asList("a", "b");
CollectionConverters.asScala(javaList).toSeq();
// Seq[String] = List(a, b)
Solution 4
This worked for me! (Java 8, Spark 2.0.0)
import java.util.ArrayList;
import scala.collection.JavaConverters;
import scala.collection.Seq;
public class Java2Scala
{
public Seq<String> getSeqString(ArrayList<String> list)
{
return JavaConverters.asScalaIterableConverter(list).asScala().toSeq();
}
}
Solution 5
@Fundhor, the method asScalaIterableConverter
was not showing up in the IDE. It may be due to a difference in the versions of Scala. I am using Scala 2.11. Instead, it showed up asScalaIteratorConverter
. I made a slight change to your final snippet and it worked fine for me.
scala.collection.JavaConverters.asScalaIteratorConverter(columnNames.iterator()).asScala().toSeq()
where columnNames
is a java.util.List
.
thanks !
Fundhor
Updated on July 09, 2022Comments
-
Fundhor almost 2 years
I need to implement a method that returns a Scala
Seq
, in Java.But I encounter this error:
java.util.ArrayList cannot be cast to scala.collection.Seq
Here is my code so far:
@Override public Seq<String> columnNames() { List<String> a = new ArrayList<String>(); a.add("john"); a.add("mary"); Seq<String> b = (scala.collection.Seq<String>) a; return b; }
But
scala.collection.JavaConverters
doesn't seem to offer the possibility to convert as aSeq
. -
kap almost 7 years
JavaConversions
is deprecated and now it should be written asJavaConverters.asScalaBuffer(a)
-
Dima almost 7 yearsShould be? Nah ... Recommended by some unknown person who thought it was a better idea is more like it :)
-
kap almost 7 yearsProbably. I just followed the hint in the Scala API. I do not know either of the persons who was writing and/or deprecating it ;-)
-
Adrien Brunelat about 6 yearsSlightly shorter version:
JavaConverters.asScalaIterableConverter(a).asScala().toSeq();
-
Per Lundberg almost 5 years
JavaConverters.collectionAsScalaIterableConverter(list).asScala().toSeq()
was the proper approach for me with Scala 2.12.6. There is also aJavaConverters.iterableAsScalaIterableConverter
method if the source is an iterable instead of a collection. -
sapy over 4 yearsasScalaIteratorConverter (java.util.Iterator<A>) in JavaConverters cannot be applied to (scala.collection.Iterator<java.lang.String>) reason: no instance(s) of type variable(s) A exist so that Iterator<String> conforms to Iterator<A