如何从Java List获取Scala List?

142
我有一个返回List类型的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。在上下文中如何实现?


2
可能是重复的问题:将Java集合转换为Scala集合 - Kim Stebel
@Kim:我不确定将此关闭为那个特定问题的重复是否合适——那个特定问题谈论的是Scala 2.7,而scala.collection.jcl包在Scala 2.8和2.9中已经不存在了。 - Ken Bloom
6个回答

187

请注意,自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._


14
在2.10.4中,我不得不导入scala.collection.JavaConverters._,否则会出现"value asScala is not a member of java.util.List[String]"的错误。 - dranxo
11
JavaConversions自2.12.0版本开始已经过时,请使用JavaConverters代替。JavaConverters与之前的用法相同,但应该具有更好的性能和可靠性。 - Yaroslav
5
针对2.13.x版本,需要使用import scala.jdk.CollectionConverters._来完成转换。 https://scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html - Nikolaos Georgiou

98

有一个非常方便的Scala对象可以用来做这件事-scala.collection.JavaConverters

您可以按照以下方式导入并使用asScala:

import scala.collection.JavaConverters._

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

这应该给你Scala的Buffer表示,使你能够实现foreach


7
JavaConverters应该优先使用,而不是JavaConversions,因为它可以使转换明确化(并避免可能令人困惑的意外转换)。(即,这是正确答案) - Mark
1
自Scala 2.13起,该类也已被弃用。请改用scala.jdk.CollectionConverters。 - stackunderflow

10
如果您需要将Java中的List<ClassA>转换为Scala中的List[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))
   }
}

10

我在寻找用Java编写的答案,但惊讶地发现这里没有任何干净的解决方案。过了一会儿我终于想出了方法,所以我决定在这里添加它,以防其他人正在寻找Java实现(我猜在Scala中也可以使用?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

将Java列表转换为Scala列表的快捷方式

import scala.jdk.CollectionConverters._

myjavaList.asScala.toList


2
scala.collection.JavaConverters._ is deprecated. Use: scala.jdk.CollectionConverters._ - Branislav Lazic

6
自Scala 2.8.1版本起,使用JavaConverters._可以使用asScala和asJava方法将Scala和Java集合相互转换。
示例代码如下: import scala.collection.JavaConverters._ javalist.asScala scalaSeq.asJava 有关转换关系的详细信息,请参见Scala文档网站

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接