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

时间:2011-06-15 10:42:44

标签: java scala

我有一个返回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。如何在上述背景下做到这一点?

6 个答案:

答案 0 :(得分:168)

编辑:请注意,这是自2.12.0以来不推荐使用的。请改用JavaConverters。 (@Yaroslav评论)

Scala 2.8 以来,此转换现已内置于语言中:

import scala.collection.JavaConversions._

...

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

的工作原理。 asScala无效

答案 1 :(得分:85)

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

您可以按照以下步骤进行导入和asScala

import scala.collection.JavaConverters._

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

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

答案 2 :(得分:8)

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

JavaConversions.asScalaBuffer(myJavaList).toList()

答案 3 :(得分:8)

如果您必须将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))
   }
}

答案 4 :(得分:6)

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

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

请参阅转化关系scala doc site

答案 5 :(得分:1)

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

myjavaList.asScala.toList

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope>