我有一个返回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
JavaConverters改用.(评论@Yaroslav)从Scala 2.8开始,此转换现在使用以下语言构建到语言中:
import scala.collection.JavaConversions._
...
lst.toList.foreach{ node => .... }
Run Code Online (Sandbox Code Playgroud)
作品.asScala不工作
小智 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.
小智 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)
我一直在寻找用Java编写的答案,令人惊讶的是在这里找不到任何干净的解决方案.经过一段时间我能够弄清楚所以我决定在这里添加它以防其他人正在寻找Java实现(我想它也适用于Scala?):
JavaConversions.asScalaBuffer(myJavaList).toList()
Run Code Online (Sandbox Code Playgroud)
由于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
| 归档时间: |
|
| 查看次数: |
77785 次 |
| 最近记录: |