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


133

我有一个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列表转换为Scala列表。在上述情况下该如何做?



@Kim:我不确定是否适合作为该特定问题的副本来关闭它–该特定问题涉及Scala 2.7,而Scala.collection.jcl包在Scala 2.8和2.9中不再存在。
肯·布鲁姆

Answers:


177

编辑:请注意,自2.12.0开始不推荐使用。使用JavaConverters代替。(@Yaroslav发表评论)

Scala 2.8开始,此转换现在使用以下语言构建到语言中:

import scala.collection.JavaConversions._

...

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

作品。asScala不工作


13
在2.10.4上,我必须导入scala.collection.JavaConverters._,否则会得到“值asScala不是java.util.List [String]的成员”
dranxo 2014年

11
JavaConversions从2.12.0开始不推荐使用。用JavaConverters代替。
Yaroslav

4
对于2.13.x,您需要import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

为此有一个方便的Scala对象-scala.collection.JavaConverters

您可以导入 asScala然后执行以下操作:

import scala.collection.JavaConverters._

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

这应该给你Scala的 Buffer表示形式,使您可以完成foreach


7
与JavaConversions相比,应该首选JavaConverters,因为它可以使转换明确化(并避免可能引起混淆的意外转换)。(即,这是正确的答案)
2014年

从scala 2.13开始,也不推荐使用此类。请改用scala.jdk.CollectionConverters。
dev-null,

9

我一直在寻找用Java编写的答案,令人惊讶的是,这里找不到任何干净的解决方案。过了一会儿我就知道了,所以我决定在这里添加它,以防其他人正在寻找Java实现(我想它也可以在Scala中使用吗?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

如果必须将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)将以下内容添加到作为参数ClassB接收的构造ClassA函数中:

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

6

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

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

请参阅转化关系scala文档网站


6

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

import scala.collection.JavaConverters._

myjavaList.asScala.toList

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.