将Java列表转换为Scala Seq

将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

我需要用Java实现一个返回Scala
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"