Convert Java List to Scala Seq

后端 未结 7 760
耶瑟儿~
耶瑟儿~ 2020-12-14 15:37

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.         


        
相关标签:
7条回答
  • 2020-12-14 15:53

    Up to 4 elements, you can simply use the factory method of the Seq class like this :

    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();
    
    0 讨论(0)
  • 2020-12-14 15:54

    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)
    
    0 讨论(0)
  • 2020-12-14 15:58
    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();
        }
    }
    

    Versions -

    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"
    
    0 讨论(0)
  • 2020-12-14 16:07

    @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 !

    0 讨论(0)
  • 2020-12-14 16:12

    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();
    }
    
    0 讨论(0)
  • 2020-12-14 16:16

    JavaConversions should work. I think, you are looking for something like this: JavaConversions.asScalaBuffer(a).toSeq()

    0 讨论(0)
提交回复
热议问题