J'ai besoin d'implémenter une méthode qui retourne un Scala Seq
, en Java.
Mais je rencontre cette erreur:
Java.util.ArrayList cannot be cast to scala.collection.Seq
Voici mon code jusqu'à présent:
@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;
}
Mais scala.collection.JavaConverters
ne semble pas offrir la possibilité de convertir en Seq
.
JavaConverters est ce dont j'avais besoin pour résoudre ce problème.
import scala.collection.JavaConverters;
public Seq<String> convertListToSeq(List<String> inputList) {
return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}
JavaConversions
devrait fonctionner. Je pense que vous cherchez quelque chose comme ceci: JavaConversions.asScalaBuffer(a).toSeq()
Cela a fonctionné pour moi! (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();
}
}
@ Fundhor , la méthode asScalaIterableConverter
n'apparaissait pas dans l'IDE. Cela peut être dû à une différence dans les versions de Scala. J'utilise Scala 2.11. Au lieu de cela, il est apparu asScalaIteratorConverter
. J'ai apporté une légère modification à votre extrait de code final et cela a bien fonctionné pour moi.scala.collection.JavaConverters.asScalaIteratorConverter(columnNames.iterator()).asScala().toSeq()
où columnNames
est un Java.util.List
.
merci !
Jusqu'à 4 éléments, vous pouvez simplement utiliser la méthode d'usine de la classe Seq comme ceci:
Seq<String> seq1 = new Set.Set1<>("s1").toSeq();
Seq<String> seq2 = new Set.Set2<>("s1", "s2").toSeq();
Seq<String> seq3 = new Set.Set3<>("s1", "s2", "s3").toSeq();
Seq<String> seq4 = new Set.Set4<>("s1", "s2", "s3", "s4").toSeq();
Démarrage Scala 2.13
, paquet scala.jdk.javaapi.CollectionConverters
remplace les packages obsolètes 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)