如何从Java列表中获取Scala列表?
我有一个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。 如何在上述情况下做到这一点?
从Scala 2.8开始,这种转换现在已经内置在语言中了:
import scala.collection.JavaConversions._ ... lst.toList.foreach{ node => .... }
作品。 asScala
没有工作
有一个方便的Scala对象 – scala.collection.JavaConverters
之后你可以进行导入和asScala
,如下所示:
import scala.collection.JavaConverters._ val lst = node.getByXPath(xpath).asScala lst.foreach{ node => .... }
这应该给你Scala的Buffer
表示允许你完成foreach
。
我正在寻找用Java编写的答案,并且在这里找不到任何干净的解决scheme。 过了一段时间,我能够弄清楚,所以我决定在这里添加它,以防别人正在寻找Java实现(我想这也适用于Scala?):
JavaConversions.asScalaBuffer(myJavaList).toList()
如果您必须将Java List<ClassA>
转换为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)) } }