如何从 Java 列表中获取 Scala 列表?
Posted
技术标签:
【中文标题】如何从 Java 列表中获取 Scala 列表?【英文标题】:How to get Scala List from Java List? 【发布时间】:2011-09-15 10:26:19 【问题描述】:我有一个 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。如何在上述情况下做到这一点?
【问题讨论】:
Converting Java collection into Scala collection的可能重复 @Kim:我不确定将其作为该特定问题的副本关闭是否合适——该特定问题涉及 Scala 2.7,并且 scala.collection.jcl 包不存在Scala 2.8 和 2.9 中不再存在。 【参考方案1】:编辑:请注意,自 2.12.0 以来已弃用。请改用JavaConverters
。 (@Yaroslav 评论)
从 Scala 2.8 开始,这种转换现在被内置到语言中,使用:
import scala.collection.JavaConversions._
...
lst.toList.foreach node => ....
有效。 asScala
无效
在 2.12.x 中使用 import scala.collection.JavaConverters._
在 2.13.x 中使用 import scala.jdk.CollectionConverters._
【讨论】:
在 2.10.4 上我必须导入 scala.collection.JavaConverters._ 否则我得到“value asScala is not a member of java.util.List[String]”JavaConversions
自 2.12.0 起已弃用。请改用JavaConverters
。
对于 2.13.x,你需要 import scala.jdk.CollectionConverters._
scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html【参考方案2】:
为此提供了一个方便的 Scala 对象 - scala.collection.JavaConverters
您可以按如下方式进行导入和asScala
:
import scala.collection.JavaConverters._
val lst = node.getByXPath(xpath).asScala
lst.foreach node => ....
这应该为您提供 Scala 的 Buffer
表示,允许您完成 foreach
。
【讨论】:
JavaConverters 应该优先于 JavaConversions,因为它使转换变得明确(并避免可能造成混淆的意外转换)。 (即,这是正确答案) 因为 scala 2.13 这个类也被弃用了。请改用 scala.jdk.CollectionConverters。【参考方案3】:我一直在寻找用 Java 编写的答案,但令人惊讶的是在这里找不到任何干净的解决方案。过了一会儿我才弄明白,所以我决定在这里添加它,以防其他人正在寻找 Java 实现(我猜它也适用于 Scala?):
JavaConversions.asScalaBuffer(myJavaList).toList()
【讨论】:
【参考方案4】:如果您必须将 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))
【讨论】:
【参考方案5】:将java列表转换为scala列表的快捷方式
import scala.jdk.CollectionConverters._
myjavaList.asScala.toList
【讨论】:
scala.collection.JavaConverters._
已弃用。使用:scala.jdk.CollectionConverters._
【参考方案6】:
从 scala 2.8.1 开始使用JavaConverters._
使用 asScala 和 asJava 方法转换 scala 和 Java 集合。
import scala.collection.JavaConverters._
javalist.asScala
scalaSeq.asJava
查看转化关系scala doc site
【讨论】:
以上是关于如何从 Java 列表中获取 Scala 列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模式匹配在scala中获取一个nonEmpty列表?
如何使用scala和aws-java-sdk从S3存储桶中获取所有S3ObjectSummary?