如何从 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&lt;ClassA&gt; 转换为 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:从变量列列表中获取与最大列值对应的列名

如何使用模式匹配在scala中获取一个nonEmpty列表?

如何使用scala和aws-java-sdk从S3存储桶中获取所有S3ObjectSummary?

通过scala获取存储在azure数据湖中的文件名列表

如何从 SCALA 中的表中提取与列表中存在的索引相对应的行。?

如何从 Scala 中的映射键中获取值的常见元素?