Convert Java List to Scala Seq

63,009

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 !

Share:
63,009
Fundhor
Author by

Fundhor

Updated on July 09, 2022

Comments

  • Fundhor
    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 a Seq.

  • kap
    kap almost 7 years
    JavaConversions is deprecated and now it should be written as JavaConverters.asScalaBuffer(a)
  • Dima
    Dima almost 7 years
    Should be? Nah ... Recommended by some unknown person who thought it was a better idea is more like it :)
  • kap
    kap almost 7 years
    Probably. 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
    Adrien Brunelat about 6 years
    Slightly shorter version: JavaConverters.asScalaIterableConverter(a).asScala().toSeq()‌​;
  • Per Lundberg
    Per Lundberg almost 5 years
    JavaConverters.collectionAsScalaIterableConverter(list).asSc‌​ala().toSeq() was the proper approach for me with Scala 2.12.6. There is also a JavaConverters.iterableAsScalaIterableConverter method if the source is an iterable instead of a collection.
  • sapy
    sapy over 4 years
    asScalaIteratorConverter (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