【问题标题】:Convert Java List to Scala Seq将 Java 列表转换为 Scala 序列
【发布时间】:2016-03-14 13:02:04
【问题描述】:

我需要用 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;
}

但是scala.collection.JavaConverters 似乎没有提供转换为Seq 的可能性。

【问题讨论】:

  • 如果您尝试在 Java 中使用 Scala 集合做任何事情,您就是在自找麻烦。编写一些使用 scala.collection.JavaConverters 进行转换的 Scala 代码。
  • @TzachZohar 大部分答案都是 scala。我的代码是 Java,它是一个庞大程序的一部分,我无法将这种处理方式外部化...
  • 正如@LuigiPlinge 提到的,这不是一个好主意!尝试在此序列上调用方法可能会遇到很多问题,上帝禁止你尝试调用任何需要隐式的东西
  • “它们可能导致意外的行为和性能”在文档中听起来不是很有说服力......尤其是因为下一句建议JavaConverters“提供相同的 转换”。 :)

标签: java scala seq scala-java-interop


【解决方案1】:

JavaConverters 是我解决这个问题所需要的。

import scala.collection.JavaConverters;

public Seq<String> convertListToSeq(List<String> inputList) {
    return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}

【讨论】:

【解决方案2】:

JavaConversions 应该可以工作。我想,你正在寻找这样的东西:JavaConversions.asScalaBuffer(a).toSeq()

【讨论】:

  • JavaConversions 已弃用,现在应写为JavaConverters.asScalaBuffer(a)
  • 应该?不...由一些不知名的人推荐,他们认为这是一个更好的主意,更像是这样:)
  • 可能。我只是按照 Scala API 中的提示进行操作。我不认识写和/或反对它的人;-)
【解决方案3】:

Scala 2.13 开始,包scala.jdk.javaapi.CollectionConverters 替换已弃用的包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)

【讨论】:

    【解决方案4】:

    这对我有用! (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();
            }
    
    }
    

    【讨论】:

      【解决方案5】:

      @Fundhor,方法 asScalaIterableConverter 没有出现在 IDE 中。这可能是由于 Scala 的版本不同。我正在使用 Scala 2.11。相反,它显示为asScalaIteratorConverter。我对您的最终 sn-p 进行了轻微更改,它对我来说效果很好。

      scala.collection.JavaConverters.asScalaIteratorConverter(columnNames.iterator()).asScala().toSeq() 其中columnNamesjava.util.List

      谢谢!

      【讨论】:

        【解决方案6】:

        最多4个元素,你可以像这样简单地使用Seq类的工厂方法:

        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();
        

        【讨论】:

          【解决方案7】:
          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"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-23
            • 2014-02-21
            • 1970-01-01
            • 2017-11-15
            • 2020-02-09
            • 1970-01-01
            • 2019-05-23
            相关资源
            最近更新 更多