如何从 Java 列表中获取 Scala 列表?

我有一个 Java API,它返回一个 List,类似于:

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 列表转换成 Scala 列表。如何在上面的上下文中做到这一点?

100352 次浏览

这里有一个方便的 Scala 对象—— 集合,JavaConverters

你可按以下方法进行汇入及汇入 asScala:

import scala.collection.JavaConverters._


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

这应该给你 Scala 的 Buffer表示,允许你完成 foreach

编辑: 注意,这在2.12.0之后就被废弃了。改用 JavaConverters

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._

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

JavaConversions.asScalaBuffer(myJavaList).toList()

如果您必须将 JavaList<ClassA>转换为 ScalaList[ClassB],那么您必须执行以下操作:

1)加入

import scala.collection.JavaConverters._

2)使用方法 asScalatoList,然后 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))
   }
}

因为 scala 2.8.1使用 JavaConverters._ 使用 asScala 和 asJava 方法转换 scala 和 Java 集合。

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

参见转换关系 Scala Doc 网站

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

import scala.jdk.CollectionConverters._

myjavaList.asScala.toList