【问题标题】:How to get Scala List from Java List?如何从 Java 列表中获取 Scala 列表?
【发布时间】:2011-09-15 10:26:19
【问题描述】:

我有一个 Java API,它返回如下列表:

public List<?> getByXPath(String xpathExpr)

我正在使用以下 scala 代码:

val lst = node.getByXPath(xpath)

现在,如果我尝试像这样的 scala 语法糖:

lst.foreach{ node => ... }

它不起作用。我得到了错误:

value foreach is not a member of java.util.List[?0]

看来我需要将 Java List 转换为 Scala List。如何在上述情况下做到这一点?

【问题讨论】:

  • @Kim:我不确定将其作为该特定问题的副本关闭是否合适——该特定问题涉及 Scala 2.7,并且 scala.collection.jcl 包不存在Scala 2.8 和 2.9 中不再存在。

标签: java scala


【解决方案1】:

编辑:请注意,自 2.12.0 以来已弃用。请改用JavaConverters。 (@Yaroslav 评论)

Scala 2.8 开始,这种转换现在被内置到语言中,使用:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

有效。 asScala 无效

在 2.12.x 中使用 import scala.collection.JavaConverters._

在 2.13.x 中使用 import scala.jdk.CollectionConverters._

【讨论】:

  • 在 2.10.4 上我必须导入 scala.collection.JavaConverters._ 否则我得到“value asScala is not a member of java.util.List[String]”
  • JavaConversions 自 2.12.0 起已弃用。请改用JavaConverters
  • 对于 2.13.x,你需要 import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
【解决方案2】:

为此提供了一个方便的 Scala 对象 - scala.collection.JavaConverters

您可以按如下方式进行导入和asScala

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

这应该为您提供 Scala 的 Buffer 表示,允许您完成 foreach

【讨论】:

  • JavaConverters 应该优先于 JavaConversions,因为它使转换变得明确(并避免可能造成混淆的意外转换)。 (即,这是正确答案)
  • 因为 scala 2.13 这个类也被弃用了。请改用 scala.jdk.CollectionConverters。
【解决方案3】:

我一直在寻找用 Java 编写的答案,但令人惊讶的是在这里找不到任何干净的解决方案。过了一会儿我才弄明白,所以我决定在这里添加它,以防其他人正在寻找 Java 实现(我猜它也适用于 Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()

【讨论】:

    【解决方案4】:

    如果您必须将 Java List&lt;ClassA&gt; 转换为 Scala List[ClassB],则必须执行以下操作:

    1) 添加

    import scala.collection.JavaConverters._
    

    2) 使用方法asScala, toList 然后map

    List <ClassA> javaList = ...
    var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))
    

    3) 将以下内容添加到接收ClassA 作为参数的ClassB 构造函数中:

    case class ClassB () {
       def this (classA: ClassA) {
          this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
       }
    }
    

    【讨论】:

      【解决方案5】:

      将java列表转换为scala列表的快捷方式

      import scala.jdk.CollectionConverters._

      myjavaList.asScala.toList

      【讨论】:

      • scala.collection.JavaConverters._ 已弃用。使用:scala.jdk.CollectionConverters._
      【解决方案6】:

      从 scala 2.8.1 开始使用JavaConverters._ 使用 asScala 和 asJava 方法转换 scala 和 Java 集合。

      import scala.collection.JavaConverters._

      javalist.asScala

      scalaSeq.asJava

      查看转化关系scala doc site

      【讨论】:

        猜你喜欢
        • 2015-01-19
        • 2019-12-31
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        相关资源
        最近更新 更多