将Java列表转换为Scala Seq
我需要用Java实现一个返回Scala将Java列表转换为Scala Seq,java,scala,seq,scala-java-interop,Java,Scala,Seq,Scala Java Interop,我需要用Java实现一个返回ScalaSeq的方法 但我遇到了这个错误: java.util.ArrayList cannot be cast to scala.collection.Seq 以下是我目前的代码: @Override public Seq<String> columnNames() { List<String> a = new ArrayList<String>(); a.add("john"); a.add("mar
Seq
的方法
但我遇到了这个错误:
java.util.ArrayList cannot be cast to scala.collection.Seq
以下是我目前的代码:
@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;
}
@覆盖
public Seq columnNames(){
列表a=新的ArrayList();
a、 添加(“约翰”);
a、 添加(“玛丽”);
Seq b=(scala.collection.Seq)a;
返回b;
}
但是
scala.collection.JavaConverters
似乎没有提供转换为Seq
的可能性,我需要解决这个问题
import scala.collection.JavaConverters;
public Seq<String> convertListToSeq(List<String> inputList) {
return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}
导入scala.collection.JavaConverters;
public Seq convertListToSeq(列表输入列表){
返回JavaConverters.AsscalAteratorConverter(inputList.iterator()).asScala().toSeq();
}
Java转换应该可以工作。我想,您正在寻找这样的东西:JavaConversions.asScalaBuffer(a).toSeq()
@,方法asscalaterableConverter
没有显示在IDE中。这可能是因为Scala的版本不同。我正在使用Scala 2.11。相反,它显示为AsscalAteratorConverter
。我对你的最后一段代码做了一点小小的修改,它对我来说效果很好。scala.collection.JavaConverters.AsscalAteratorConverter(columnNames.iterator()).asScala().toSeq()
其中columnNames
是一个java.util.List
谢谢 最多4个元素,您可以简单地使用Seq类的factory方法,如下所示:
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();
Seq seq1=new Set.Set1(“s1”).toSeq();
Seq seq2=新的Set.Set2(“s1”、“s2”).toSeq();
Seq seq3=新的Set.Set3(“s1”、“s2”、“s3”).toSeq();
Seq seq4=新的Set.Set4(“s1”、“s2”、“s3”、“s4”).toSeq();
这对我很有效!(Java 8,Spark 2.0.0)
import java.util.ArrayList;
导入scala.collection.JavaConverters;
导入scala.collection.Seq;
公共类Java2Scala
{
public Seq getSeqString(ArrayList列表)
{
返回JavaConverters.asScalaIterableConverter(list.asScala().toSeq();
}
}
启动Scala 2.13
,软件包将替换不推荐的软件包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)
导入scala.jdk.javaapi.CollectionConverters;
//List javaList=Arrays.asList(“a”、“b”);
acscala(javaList.toSeq();
//Seq[String]=列表(a,b)
如果您尝试使用Java中的Scala集合执行任何操作,可能会重复您自找的麻烦。编写一段Scala代码,使用Scala.collection.JavaConverters进行转换。@TzachZohar大部分答案都是Scala。我的代码是Java,它是一个庞大程序的一部分,我不能将这种处理方法具体化……正如@Luigipling提到的,这不是一个好主意!您在尝试调用此序列上的方法时可能会遇到很多问题,上帝禁止您尝试调用任何需要隐式的内容。文档中的“它们可能导致意外的行为和性能”听起来不是很有说服力。。。特别是,因为下一句话建议“提供相同的转换”的JavaConverters
。)JavaConversions
已被弃用,现在它应该写成JavaConversions。asScalaBuffer(a)
应该是什么?不。。。由一些不认识的人推荐,他们认为这是一个更好的主意,更像是:)可能。我只是遵循了Scala API中的提示。我不知道有谁在写和/或反对它;-)略短的版本:JavaConverters.asScalaIterableConverter(a.asScala().toSeq()
JavaConverter.CollectionsCalateRableConverter(列表).asScala().toSeq()
是我使用Scala 2.12.6的合适方法。还有一个JavaConverters.IterableScalaitRaileConverter
方法,如果源是一个iterable而不是集合。JavaConverters中的AsscalAteratorConverter(java.util.Iterator)不能应用于(scala.collection.Iterator)原因:不存在类型变量a的实例,因此迭代器符合迭代器
import scala.jdk.javaapi.CollectionConverters;
// List<String> javaList = Arrays.asList("a", "b");
CollectionConverters.asScala(javaList).toSeq();
// Seq[String] = List(a, b)
import scala.collection.JavaConverters;
import scala.collection.Seq;
import java.util.ArrayList;
public class Helpers {
public Seq<String> convertListToSeq(ArrayList<String> inputList) {
return JavaConverters.collectionAsScalaIterableConverter(inputList).asScala().toSeq();
}
}
compile 'org.apache.spark:spark-core_2.11:2.3.1'
compile 'org.apache.spark:spark-sql_2.11:2.3.1'
compile group: 'commons-io', name: 'commons-io', version: '2.6'
compile "com.fasterxml.jackson.module:jackson-module-scala_2.11:2.8.8"