如何从Java列表中获取Scala列表?
我有一个Java API,它返回如下列表:如何从Java列表中获取Scala列表?,java,scala,Java,Scala,我有一个Java API,它返回如下列表: public List<?> getByXPath(String xpathExpr) 现在,如果我尝试scala语法,比如: lst.foreach{ node => ... } 它不起作用。我得到一个错误: value foreach is not a member of java.util.List[?0] 似乎我需要将Java列表转换为Scala列表。如何在上面的上下文中做到这一点?有一个方便的Scala对象,只用于此-
public List<?> getByXPath(String xpathExpr)
现在,如果我尝试scala语法,比如:
lst.foreach{ node => ... }
它不起作用。我得到一个错误:
value foreach is not a member of java.util.List[?0]
似乎我需要将Java列表转换为Scala列表。如何在上面的上下文中做到这一点?有一个方便的Scala对象,只用于此- 您可以按如下方式进行导入和
asScala
:
导入scala.collection.JavaConverters_
val lst=node.getByXPath(xpath).asScala
lst.foreach{node=>…}
这将为您提供Scala的缓冲区
表示,允许您完成foreach
编辑:注意,自2.12.0以来,它已被弃用。改用JavaConverters
。(雅罗斯拉夫评论)
由于Scala 2.8此转换现在内置到语言中,使用:
import scala.collection.JavaConversions._
...
lst.toList.foreach{ node => .... }
工作<代码>协会不起作用
在2.12.x中,使用导入scala.collection.JavaConverters.\uu
在2.13.x中,使用导入scala.jdk.CollectionConverters.\u我正在寻找用Java编写的答案,但令人惊讶的是,在这里找不到任何干净的解决方案。过了一段时间,我终于明白了这一点,所以我决定在这里添加它,以防其他人正在寻找Java实现(我想它在Scala中也能工作?):
如果必须将Java
列表
转换为Scala列表[ClassB]
,则必须执行以下操作:
1) 加
2) 使用方法asScala
,toList
然后map
List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))
因为scala 2.8.1使用了
JavaConverters.\uz
使用asScala和asJava方法转换scala和Java集合
导入scala.collection.JavaConverters.\ucode>
javalist.asScala
scalaSeq.asJava
请参见转换关系将java列表转换为scala列表的快捷方式
导入scala.collection.JavaConverters.\ucode>
myjavaList.asScala.toList
可能与@Kim重复:我不确定是否适合将此作为特定问题的重复来结束--特定问题涉及Scala 2.7,scala 2.8和2.9中不再存在scala.collection.jcl包。在2.10.4中,我必须导入scala.collection.JavaConverters。否则我得到了“value asScala不是java.util.List[String]的成员”javaconversion
自2.12.0以来一直被弃用。改用JavaConverters
。对于2.13.x,您需要导入scala.jdk.CollectionConverters。
JavaConverters应该优先于JavaConverters,因为它使转换显式化(并避免可能混淆的意外转换)。(也就是说,这是正确的答案)因为scala 2.13这个类也被弃用了。改用scala.jdk.CollectionConverters。
JavaConversions.asScalaBuffer(myJavaList).toList()
import scala.collection.JavaConverters._
List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))
case class ClassB () {
def this (classA: ClassA) {
this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
}
}