我有一个返回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。如何在上述背景下做到这一点?
答案 0 :(得分:168)
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)使用方法asScala
,toList
然后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>