如何从Java列表中获取Scala列表?

ace*_*ace 129 java scala

我有一个返回List的Java API,如:

public List<?> getByXPath(String xpathExpr)
Run Code Online (Sandbox Code Playgroud)

我使用下面的scala代码:

val lst = node.getByXPath(xpath)
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试scala语法糖,如:

lst.foreach{ node => ... }
Run Code Online (Sandbox Code Playgroud)

这是行不通的.我收到错误:

value foreach is not a member of java.util.List[?0]
Run Code Online (Sandbox Code Playgroud)

看来我需要将Java List转换为Scala List.如何在上述背景下做到这一点?

ace*_*ace 172

编辑:请注意,这是自2.12.0以来不推荐使用的.请JavaConverters改用.(评论@Yaroslav)

Scala 2.8开始,此转换现在使用以下语言构建到语言中:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }
Run Code Online (Sandbox Code Playgroud)

作品.asScala不工作

  • 在2.10.4我必须导入scala.collection.JavaConverters._否则我得到"值asScala不是java.util.List [String]的成员" (13认同)
  • `JavaConversions`自2.12.0起不推荐使用.请改用"JavaConverters". (11认同)
  • 你能详细说明为什么asScala不起作用吗? (5认同)
  • 对于 2.13.x,您需要 `import scala.jdk.CollectionConverters._` https://scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html (5认同)

小智 90

有一个方便的Scala对象 - scala.collection.JavaConverters

你可以进行导入,asScala然后按如下方式进行:

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }
Run Code Online (Sandbox Code Playgroud)

这应该为您提供Scala的Buffer表示,让您完成foreach.

  • JavaConverters应优先于JavaConversions,因为它使转换成为显式(并避免可能令人困惑的意外转换).(即,这是正确的答案) (7认同)

小智 9

如果必须将Java转换为List<ClassA>Scala List[ClassB],则必须执行以下操作:

1)添加

import scala.collection.JavaConverters._
Run Code Online (Sandbox Code Playgroud)

2)使用方法asScala,toList然后map

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))
Run Code Online (Sandbox Code Playgroud)

3)将以下内容添加到作为参数ClassB接收的构造ClassA函数中:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}
Run Code Online (Sandbox Code Playgroud)


Rad*_*dix 8

我一直在寻找用Java编写的答案,令人惊讶的是在这里找不到任何干净的解决方案.经过一段时间我能够弄清楚所以我决定在这里添加它以防其他人正在寻找Java实现(我想它也适用于Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
Run Code Online (Sandbox Code Playgroud)


use*_*728 6

由于scala 2.8.1用于JavaConverters._ 使用asScala和asJava方法转换scala和Java集合.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

请参阅转换关系scala doc站点


小智 6

将java列表转换为scala列表的快捷方式

import scala.collection.JavaConverters._

myjavaList.asScala.toList

  • `scala.collection.JavaConverters._` 已弃用。使用:`scala.jdk.CollectionConverters._` (2认同)